我在用multiprocessing.imap_unordered
对值列表执行计算:
def process_parallel(fnc, some_list):
pool = multiprocessing.Pool()
for result in pool.imap_unordered(fnc, some_list):
for x in result:
yield x
pool.terminate()
每次致电fnc
根据设计,返回一个巨大的对象作为结果。我可以在 RAM 中存储此类对象的 N 个实例,其中 N ~ cpu_count,但不能更多(不是数百)。
现在,使用这个功能占用了太多的内存。内存完全消耗在主进程中,而不是消耗在工作进程中。
如何imap_unordered
存储完成的结果?我的意思是工作人员已经返回但尚未传递给用户的结果。我认为它很聪明,只根据需要“懒惰地”计算它们,但显然不是。
看起来因为我无法消费结果process_parallel
足够快,池不断地对这些巨大的对象进行排队fnc
某处,内部,然后爆炸。有办法避免这种情况吗?以某种方式限制其内部队列?
我使用的是Python2.7。干杯。
通过查看相应的源文件可以看到(python2.7/multiprocessing/pool.py
),IMapUnorderedIterator 使用collections.deque
用于存储结果的实例。如果出现新项目,则会在迭代中添加和删除它。
正如您所建议的,如果在主线程仍在处理该对象时另一个巨大对象进入,这些对象也将存储在内存中。
你可能会尝试的是这样的:
it = pool.imap_unordered(fnc, some_list)
for result in it:
it._cond.acquire()
for x in result:
yield x
it._cond.release()
如果任务结果接收器线程尝试将下一个对象放入双端队列,那么在处理项目时,这应该会导致任务结果接收器线程被阻塞。
因此内存中的大对象不应超过两个。
如果这适用于你的情况,我不知道;)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)