在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()

sub_dicts的长度约为62,500个键,每个值都是一个分为几页的单词文档,这些单词被分成一个numpy数组。

我发现,整个脚本趋向于在func执行结束时被卡住。 func在每个进程中运行大约需要25分钟(我有16个内核),但是接下来我需要等待一个小时才能完成所有工作。

another post上,评论者认为这可能是由于多重处理的开销所致。也就是说,需要对那些巨大的sub_dict进行腌制和去腌制才能重新加入主流程。

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

更多上下文

在这里所做的是将一大堆文件名分成16个小块,然后将它们发送到func。然后func打开这些文件提取内容,对其进行预处理,然后将其放入带有sub_dict的{​​{1}}中。然后,{filename: content}返回到要添加sub_dict中的主要过程。昂贵的不是原始数组块的酸洗。这是即将到来的main_dict

的腌制品

编辑

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)