簡體   English   中英

Python 多處理:在映射期間減少?

[英]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操作返回的結果?

迭代器映射器imapimap_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM