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