使用大数据进行多处理

use*_*114 24 python generator multiprocessing

multiprocessing.Pool()用来并行化一些繁重的计算.

目标函数返回大量数据(一个巨大的列表).我的RAM用完了.

如果没有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
Run Code Online (Sandbox Code Playgroud)

这是Python 2.7.

Lor*_*ams 17

这听起来像是队列的理想用例:http://docs.python.org/2/library/multiprocessing.html#exchanging-objects-between-processes

只需将结果从汇集的工作人员提供到队列中,然后在主服务器中将其摄取.

请注意,您仍然可能遇到内存压力问题,除非您排队队列的速度几乎与工作人员填充队列一样快.您可以限制队列大小(适合队列的最大对象数),在这种情况下,池化工作人员将阻塞queue.put语句,直到队列中有空间可用.这将对内存使用量设置上限. 但是,如果你这样做,可能是时候重新考虑你是否需要合并和/或是否有意义使用更少的工人.

  • 队列将传递pickle数据.所以数据 - > pickle-> unpickle->新的数据副本.这将减慢程序并使用更多额外的RAM.应该考虑使用共享内存. (6认同)