2014-02-21 65 views
0

我想在使用pool.imap_unordered的進程之間共享一個大的numpy數組。應該很容易,但我試圖從。現在我只是每次都傳遞數據,一切正常,直到數據變得足夠大並且池暫停並且不啓動並行進程。由於每個並行進程只需要一部分大數據,另一種方法是隻傳遞一個子集,但我不知道如何在當前框架中使用。在一個類中的進程之間共享大數據

由於用於多重功能必須在全局命名空間,我把類的超出了我的功能如下(實際問題的玩具爲例):

import numpy as np 
import mutliprocessing.Pool 
import itertools 

def process(args): 
    large_data, index = args 
    return some_costly_operation(large_data[index]) 

class MyClass: 
    def __init__(self): 
     # Let's pretend this is large 
     self.data = np.zeros(10) 

    def do(self): 
     p = Pool() 
     for result in p.imap_unordered(process, 
      itertools.izip(itertools.repeat(self.data), xrange(10)))): 

      print result 

我知道這是一個hack- y方法來做多處理,理論上你不應該在課堂上做到這一點,並應通過檢查你是否處於主要地位來保護...任何替代方案或建議?

回答

1

我認爲你應該使用二進制/緊湊內存佈局和mmap專門爲numpy陣列。

作爲練習的代碼留給讀者,但我可能會嘗試破解一些東西:)

+0

謝謝!太棒了。我認爲稍微改進是專門使用numpy.memmap,而不是python的mmap。 – aleph4

+1

哦numpy現在提供嗎?真棒! (我認爲它必須使用緩衝區來破解) –

1

您可以將數據序列化到來自調用者的磁盤上,並只傳遞文件名到工作進程?如果響應可能很大,工作人員可以序列化它並將文件名返回給調用者。這是我在處理大型數據集時使用的。

+0

謝謝,這將完全工作。我希望有一個「黑客」少。總體來說有點失望w/how多處理接口與類 – aleph4

+0

我再次想到了這一點,我不確定這將工作,因爲每個實例都必須加載數據在某個點反正 - 導致RAM過載。還有其他建議嗎? – aleph4

+1

多處理可讓您使用共享內存,這似乎是唯一可行的解​​決方案,如果您必須讓多個進程同時訪問相同的大內存結構。但這似乎是一個奇怪的要求。您可以讓調用者序列化到磁盤,從內存卸載,從磁盤加載工作負載,完成工作並寫入磁盤,從內存中卸載等。這樣,任何時候只有任何給定數據集的一個副本將在內存中。 –