我正在使用 multiprocessing.Pool()
来并行化一些繁重的计算。
目标函数返回大量数据(一个巨大的列表)。我的内存快用完了。
如果没有 multiprocessing
,我只需将目标函数更改为生成器,通过 yield
在计算结果元素时一个接一个地处理。
我知道多处理不支持生成器——它会等待整个输出并立即返回,对吗?没有屈服。有没有办法让 Pool
工作人员在可用时立即生成数据,而无需在 RAM 中构建整个结果数组?
简单示例:
def target_fnc(arg):
result = []
for i in xrange(1000000):
result.append('dvsdbdfbngd') # <== would like to just use yield!
return result
def process_args(some_args):
pool = Pool(16)
for result in pool.imap_unordered(target_fnc, some_args):
for element in result:
yield element
这是 Python 2.7。
最佳答案
这听起来像是队列的理想用例:http://docs.python.org/2/library/multiprocessing.html#exchanging-objects-between-processes
只需将您的结果从池中的工作人员中输入队列,然后将它们摄取到主服务器中。
请注意,除非您排空队列的速度几乎与工作人员填充队列的速度一样快,否则您仍然可能会遇到内存压力问题。您可以限制队列大小(队列中可容纳的最大对象数),在这种情况下,池中的工作人员将阻塞 queue.put
语句,直到队列中有可用空间。这将对内存使用设置上限。 但是如果你这样做,可能是时候重新考虑你是否需要池化和/或使用更少的 worker 是否有意义。
关于python - 大数据多处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14677287/