[英]Python multiprocessing: reduce during map?
在使用 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
结果pool.map
使用它们,并在减少后对它们进行垃圾收集,以消除首先存储所有值的需要。
我现在可以在结果进入的地方写一些mp.queue
然后写一些消耗队列的工作人员来总结结果,但这将 (1) 需要更多的代码行和 (2) 感觉就像一个(可能更慢)黑客 -围绕我而不是干净的代码。
有没有办法直接减少mp.Pool
操作返回的结果?
迭代器映射器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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.