[英]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.