Я использую многопроцессорность 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
даже правильная вещь в этом случае? Я видел другие предложения (например, очередь), но я немного запутался. Какие существуют варианты обмена памятью, и какой из них был бы лучше в этом случае?