Совместное использование больших объектов в многопроцессорных пулах - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь вернуться к этому немного более старому вопросу и посмотреть, есть ли лучший ответ в эти дни.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...