如何解决在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 举报,一经查实,本站将立刻删除。