многопроцессорность в python – совместное использование большого объекта (например, dataframe pandas) между несколькими процессами

Я использую многопроцессорность Python, точнее

from multiprocessing import Pool p = Pool(15) args = [(df, config1), (df, config2), ...] #list of args - df is the same object in each tuple res = p.map_async(func, args) #func is some arbitrary function p.close() p.join() 

Этот подход имеет огромное потребление памяти; едя почти всю мою оперативную память (в этот момент она становится очень медленной, поэтому делает многопроцессорную обработку бесполезной). Я предполагаю, что проблема заключается в том, что df – это огромный объект (большой панда данных pandas), и он копируется для каждого процесса. Я попытался использовать multiprocessing.Value Чтобы поделиться файловым кадром без копирования

 shared_df = multiprocessing.Value(pandas.DataFrame, df) args = [(shared_df, config1), (shared_df, config2), ...] 

(как это предлагается в общей памяти Python для многопроцессорной обработки ), но это дает мне TypeError: this type has no size (такой же, как « Общий доступ к сложному объекту между процессами Python» , к которому я, к сожалению, не понимаю ответ).

Я использую многопроцессорность в первый раз, и, возможно, мое понимание еще недостаточно. Является multiprocessing.Value Значит, даже правильная вещь для использования в этом случае? Я видел другие предложения (например, очередь), но я немного запутался. Какие существуют варианты обмена памятью, и какой из них был бы лучше в этом случае?

  • Как обеспечить, чтобы ключи ключа python были строчными?
  • windows scrapyd-deploy не распознается
  • Parse Имя пользователя для извлечения местоположения пользователя Twitter
  • Как удалить символ из строки с помощью python?
  • В чем преимущество использования выражения «with .. as» в Python?
  • Как настроить PyLint, чтобы проверить все проверки PEP8?
  • Как получить доступ к переменным из одного класса в другой?
  • Как рассчитать следующую пятницу в Python?
  • One Solution collect form web for “многопроцессорность в python – совместное использование большого объекта (например, dataframe pandas) между несколькими процессами”

    Первым аргументом Value является typecode_or_type . Это определяется как:

    typecode_or_type определяет тип возвращаемого объекта: это либо тип ctypes, либо один тип символа типа, используемый модулем массива. * args передается конструктору для типа.

    Акцент мой. Таким образом, вы просто не можете поместить рамку данных pandas в Value , это должен быть тип ctypes .

    Вместо этого вы можете использовать multiprocessing.Manager для обслуживания экземпляра Singleton dataframe ко всем вашим процессам. Есть несколько разных способов оказаться в одном и том же месте – возможно, самым простым является просто перебросить ваш файл данных в Namespace менеджера.

     from multiprocessing import Manager mgr = Manager() ns = mgr.Namespace() ns.df = my_dataframe # now just give your processes access to ns, ie most simply # p = Process(target=worker, args=(ns, work_unit)) 

    Теперь ваш экземпляр dataframe доступен для любого процесса, которому передается ссылка на Менеджер. Или просто передайте ссылку на Namespace , это чище.

    Одна вещь, которую я не рассматривал / не буду рассказывать, – это события и сигнализация – если вашим процессам нужно ждать, пока другие закончат выполнение, вам нужно добавить это. Вот страница с некоторыми примерами Event которые также охватывают бит более подробно, как использовать Namespace менеджера.

    (обратите внимание, что ничто из этого не multiprocessing о том, приведет ли multiprocessing к ощутимым преимуществам производительности, это просто дает вам инструменты для изучения этого вопроса)

    Python - лучший язык программирования в мире.