首页 > 解决方案 > Python多处理:地图期间减少?

问题描述

使用 Python 时有没有办法减少内存消耗pool.map

举一个简短的例子:worker()做一些繁重的工作并返回一个更大的数组......

def worker():
    # cpu time intensive tasks
    return large_array

...和一个 Pool 映射在一些大序列上:

with mp.Pool(mp.cpu_count()) as p:
    result = p.map(worker, large_sequence)

考虑到这种设置,显然result会分配大部分系统内存。但是,对结果的最终操作是:

    final_result = np.sum(result, axis=0)

因此,NumPy除了对可迭代对象进行求和操作外,实际上什么也不做:

    final_result = reduce(lambda x, y: x + y, result)

当然,这将使得可以在pool.map它们进入时消费结果并在减少后对它们进行垃圾收集以消除首先存储所有值的需要。

我现在可以写一些mp.queue结果进入的地方,然后写一些消耗队列的工作人员来总结结果,但这会(1)需要更多的代码行,(2)对我来说感觉像是(可能更慢)的黑客攻击而不是干净的代码。

有没有办法减少mp.Pool操作直接返回的结果?

标签: pythonmapreducemultiprocessingpool

解决方案


迭代器映射器imap似乎imap_unordered可以解决问题:

#!/usr/bin/env python3

import multiprocessing
import numpy as np

def worker( a ):
    # cpu time intensive tasks
    large_array = np.ones((20,30))+a
    return large_array


if __name__ == '__main__':
    
    arraysum = np.zeros((20,30))
    large_sequence = range(20)
    num_cpus = multiprocessing.cpu_count()    
    
    with multiprocessing.Pool( processes=num_cpus ) as p:
        for large_array in p.imap_unordered( worker, large_sequence ):
            arraysum += large_array

推荐阅读