Как оптимально вернуть большие DataFrames из пула рабочих процессов в python3.5? - PullRequest
0 голосов
/ 07 ноября 2019

Я передаю большой фрейм данных нескольким процессам, которые возвращают разные фреймы данных в соответствии с другими параметрами, переданными этому процессу. Я храню входной фрейм данных в Multiprocessing.NameSpace() объекте и разделяю его между всеми объединенными процессами, а входной фрейм данных не изменяется пулированными процессами. Возвращение большого фрейма данных из пула очень медленное (даже медленнее, чем последовательное выполнение). Я пытался сохранить результаты процесса в объекте Manager().dict(), но он также очень медленный, как упомянуто в документации

Диспетчеры процессов сервера более гибкие, чем объекты общей памяти, поскольку их можно поддерживатьпроизвольные типы объектов. Кроме того, один менеджер может совместно использоваться процессами на разных компьютерах по сети. Однако они работают медленнее, чем использование общей памяти.

Для справки приведу схему моего кода

def extract_stat_by_process(a_namespace, param1, param2, ..., key, process_results):
    # do something according to params
    process_output[key] = result

with mp.Manager() as manager:
    process_results = manager.dict()
    namespace = manager.NameSpace()
    namespace.df = input_df
    process_inputs = [[namespace, each[0], each[1], ..., key, process_results] for each, key in input_params]
    with mp.Pool(8) as pool:
        pool.starmap(extract_stat_by_process, process_inputs)

В настоящее время последовательная версия того же кода выше занимает около 5 секунд, в то время каквышеупомянутое занимает до 93 сек. Каков наилучший способ вернуть обработанный фрейм данных так, чтобы затраченное время было минимальным?

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