首页 > 解决方案 > python多处理中传递大对象的方法

问题描述

我正在做这样的事情:

from multiprocessing import Process, Queue

def func(queue):
    # do stuff to build up sub_dict
    queue.put(sub_dict)

main_dict = {}
num_processes = 16
processes = []
queue = Queue()
for i in range(num_processes):
    proc = Process(target=func)
    processes.append(proc)
    proc.start()

for proc in processes:
    main_dict.update(queue.get())

for proc in processes:
    proc.join()

大约有 62,500 个键长,每个值都是一个多页的sub_dicts单词文档,分成一个 numpy 数组。

我发现整个脚本在func. func在每个进程中运行大约需要 25 分钟(我有 16 个内核),但是我需要再等一个小时才能完成所有操作。

另一篇文章中,评论者认为这可能是因为多处理的开销。也就是那些巨大sub_dict的s需要被pickle和unpickled才能重新加入主进程。

除了我想出自己的数据压缩方案之外,还有什么方便的方法可以解决这个问题吗?

更多上下文

我在这里所做的是将一个非常大的文件名数组分块为 16 个片段并将它们发送到func. 然后 func 打开这些文件,提取内容,对其进行预处理,并将其放入sub_dictwith 中{filename: content}。然后sub_dict回到要添加到main_dict. 昂贵的不是原始数组块的酸洗。这是传入的酸洗sub_dicts

编辑

没有解决这里的实际问题,但我发现了我真正的问题是什么。我遇到了交换内存,因为与我正在处理的数据集的相对较小的磁盘空间相比,我低估了使用情况。将我的 VM 上的内存加倍解决了主要问题。

标签: pythonmultiprocessing

解决方案


推荐阅读