python - 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_dict
with 中{filename: content}
。然后sub_dict
回到要添加到main_dict
. 昂贵的不是原始数组块的酸洗。这是传入的酸洗sub_dicts
编辑
没有解决这里的实际问题,但我发现了我真正的问题是什么。我遇到了交换内存,因为与我正在处理的数据集的相对较小的磁盘空间相比,我低估了使用情况。将我的 VM 上的内存加倍解决了主要问题。
解决方案
推荐阅读
- c# - 如何获取在 Roslyn 的 using 语句中声明的变量的类型
- node.js - 使用文件的内容而不用 express.js 保存文件?
- mysql - SQL插入专业化表
- gnuplot - 从同一行数据文件上的点画一条线
- android - Android Firebase 实时数据库:addListenerForSingleValueEvent 没有被触发
- java - 切换数据源和选择模式时是否存在 Hibernate 多租户开销
- java - Spring boot with Azure AD authentication
- typescript - Getting error -"Undefined. Implement with the following snippet" when executing protractor cucumber typescript feature file
- mongodb - Mongodb query docs with not unique field for unique result
- angularjs - Angularjs 组件单元测试