簡體   English   中英

如何使許多perallel流程對單個共享NumPy數組進行更改?

[英]How can I make many perallel processes make changes to a single shared NumPy array?

我在互聯網上搜尋答案,但找不到任何適合我的情況。 我讀過有關multiprocessing.Manager ,嘗試過來回傳遞東西,但似乎都無法與NumPy數組一起使用。我嘗試使用Pool代替,但是我的目標方法沒有返回任何東西,它只是對數組,所以我不確定如何設置它。

現在我有:

def Multiprocess(self, sigmaI, sigmaX):
    cpus = mp.cpu_count()
    print('Number of cpu\'s to process WM: %d' % cpus)

    processes = [mp.Process(target = self.CreateMatrixMp, args = (sigmaI, sigmaX, i,)) for i in range(self.numPixels)]
    for p in processes:
        p.start()
    for p in processes:
        p.join()

目標函數CreateMatrixMp接受傳遞的值,並在進行計算后將值附加到數組data 此數組聲明為self.data = numpy.zeros(self.size, numpy.float64) 如果CreateMatrixMp方法的詳細信息有幫助,我也可以發布它。

我嘗試在運行過程的上方添加以下內容:

mgr = mp.Manager()
sharedData = mgr.Array(ctypes.c_numpy.float64, self.data)

然后將sharedData傳遞到CreateMatrixMp ,在這里可以對其進行修改。 一旦所有進程都運行並且數組完成,我就簡單地執行self.data = sharedData

但這是行不通的(盡管我知道我沒有正確設置它)。 如何使用NumPy數組完成此操作? 我希望每個進程(將有成千上萬個)附加到同一數組。

任何幫助深表感謝。

歡迎來到多線程的黑暗世界。 我認為您的最大問題是mgr.Array圍繞數組進行同步。 如果您快速生成數據,這將成為瓶頸,因為進程將等待最后一個數組完成。 如果每個進程都保留該nump數組的私有副本,它將更加高效,並且將有所幫助。 輸入所有數據后,請等待所有過程完成。 然后,您可以將所有數組組合到self.data中。 這樣,所有已處理的資源都無需等待共享資源。 此解決方案或您的解決方案都不能保證輸出列表的順序。 我從self.numPixels懷疑順序可能很重要。 解決方案很多,但最簡單的方法是按順序輸入數據並在完成后執行self.data.sort(...)。 另一種方法是,更快地預先創建self.data並使進程在正確的位置戳結果。 self.data不必是共享的數據結構,因為進程永遠不會改變任何共同點。 如果數組映射到類似C的數組,這將起作用。 它不適用於鏈接列表等。希望這會有所幫助。 詢問是否需要更多詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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