2013-11-04 23 views
6

我發現很多類似的問題,但沒有答案。對於簡單的數組,有多處理。陣列。對於稀疏矩陣或任何其他任意對象,我找到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的副本。

先謝謝您。

+1

您可能想嘗試使用[sharedmem](https://bitbucket.org/cleemesser/numpy-sharedmem/overview)而不是'multiprocessing.Manager'。出於好奇 - 你在使用什麼操作系統? – unutbu

+0

@unutbu謝謝。我要去看看sharedmem。我在集羣上的linux虛擬機上運行它 – user2727768

回答

0

Namespace對象的屬性只有在explicitly assigned to時纔會更新。好的解釋給出here

編輯:並且看着實現(在multiprocessing/managers.py),它似乎沒有使用共享內存。它只是醃製對象,並在請求時將它們發送給孩子。這可能是爲什麼它需要這麼長時間。

你有沒有機會創建一個擁有更多工人而不是你的CPU擁有內核的游泳池? (即使用Pool構造函數的參數processes)。這通常不是一個好主意。

還有一些其他的東西可以嘗試;

  • 將稀疏矩陣寫入文件,並讓每個工作進程讀取文件。操作系統可能會將文件放入其緩衝區緩存中,因此這可能比您想象的要好得多。
  • 可能的改進是使用mmap模塊使用內存映射文件。
+0

謝謝。核心數量等於工人數量。是因爲所有的員工都試圖同時訪問共享矩陣,只有一個人獲得訪問權限?我不知道經理是否有鎖。也許我應該嘗試mmap。 – user2727768

+0

@ user2727768查看更新後的答案。 –

+0

這是有道理的!謝謝 – user2727768

相關問題