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