python - 大数据多处理

标签 python multiprocessing generator

我正在使用 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/

相关文章:

python - 当我打乱一个 DataFrame 的副本时,为什么原始 DataFrame 也打乱了?

python - 使用转义 solr 保留关键字进行 Solr 搜索

python,dijkstra的最短路径,类型错误 - 生成器不支持项目分配

python - 当哨兵连续出现两次时停止迭代的简洁方法

python - Python中有 'cross-referencing'生成器吗?

python - 将 csv 转换为 json,用于 Python 或 PHP 中的 JavaScript 绘图库 Chartjs

检查超时条件的 Pythonic 方法?

python - multiprocessing.Process(使用 spawn 方法): which objects are inherited?

Python多处理映射函数错误

Python 3 : Multiprocessing API calls with exit condition