我發現很多類似的問題,但沒有答案。對於簡單的數組,有多處理。陣列。對於稀疏矩陣或任何其他任意對象,我找到manager.namespace。所以我試了下面的代碼:有沒有一種有效的方式來共享python多處理中的只讀稀疏矩陣
from scipy import sparse
from multiprocessing import Pool
import multiprocessing
import functools
def myfunc(x,ns):
return ns.A[x,:]*ns.A*ns.A[:,x]
manager = multiprocessing.Manager()
Global = manager.Namespace()
pool=Pool()
Global.A=sparse.rand(10000,10000,0.5,'csr')
myfunc2=functools.partial(myfunc,ns=Global)
r=pool.map(myfunc2, range(100))
該代碼工作但效率不高。實際上只有4名工人在工作。原因是,我猜,經理一次只允許一名工人訪問數據。由於數據是隻讀的,我並不需要鎖定。那麼有沒有更有效的方法來做到這一點?
p.s.,我看到有人在討論copy-on-write fork()。我真的不明白它是什麼,但它不起作用。如果我先生成A並執行Pool(),則每個進程將擁有A的副本。
先謝謝您。
您可能想嘗試使用[sharedmem](https://bitbucket.org/cleemesser/numpy-sharedmem/overview)而不是'multiprocessing.Manager'。出於好奇 - 你在使用什麼操作系統? – unutbu
@unutbu謝謝。我要去看看sharedmem。我在集羣上的linux虛擬機上運行它 – user2727768