我想在使用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方法來做多處理,理論上你不應該在課堂上做到這一點,並應通過檢查你是否處於主要地位來保護...任何替代方案或建議?
謝謝!太棒了。我認爲稍微改進是專門使用numpy.memmap,而不是python的mmap。 – aleph4
哦numpy現在提供嗎?真棒! (我認爲它必須使用緩衝區來破解) –