Я пытаюсь вернуться к этому немного более старому вопросу и посмотреть, есть ли лучший ответ в эти дни.
Я использую python3 и пытаюсь поделиться большим кадром данных с работниками в пуле. Моя функция читает фрейм данных, генерирует новый массив, используя данные из фрейма данных, и возвращает этот массив. Пример кода ниже ( note : в приведенном ниже примере я фактически не использую фрейм данных, но в моем коде я использую).
def func(i):
return i*2
def par_func_dict(mydict):
values = mydict['values']
df = mydict['df']
return pd.Series([func(i) for i in values])
N = 10000
arr = list(range(N))
data_split = np.array_split(arr, 3)
df = pd.DataFrame(np.random.randn(10,10))
pool = Pool(cores)
gen = ({'values' : i, 'df' : df}
for i in data_split)
data = pd.concat(pool.map(par_func_dict,gen), axis=0)
pool.close()
pool.join()
Мне интересно, можно ли как-то предотвратить загрузку генератора копиями кадра данных, чтобы не занимать столько памяти.
Ответ на ссылку выше предлагает использовать multiprocessing.Process()
, но из того, что я могу сказать, трудно использовать его поверх функций, которые возвращают вещи (необходимо включить сигналы / события), а комментарии указывают, что каждый процесс по-прежнему использует большой объем памяти.