我正在使用Python的multiprocessing
模塊來並行處理大numpy數組。這些陣列在主進程中使用numpy.load(mmap_mode='r')
進行內存映射。之後,multiprocessing.Pool()
分叉進程(我想)。NumPy與多處理和mmap
一切似乎都做工精細,但我越來越線,如:
AttributeError的( 「 'NoneType' 對象有沒有屬性 '告訴'」)在
<bound method memmap.__del__ of memmap([ 0.57735026, 0.57735026, 0.57735026, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ], dtype=float32)>
忽略
在單元測試日誌。儘管如此,測試通過很好。
任何想法發生了什麼?
使用Python 2.7.2,OS X,NumPy 1.6.1。
UPDATE:
一些調試之後,我追捕事業一個代碼路徑是使用(小片)的這個存儲器映射numpy的數組作爲輸入到Pool.imap
呼叫。
顯然,「問題」是與multiprocessing.Pool.imap
將輸入傳遞給新進程的方式:它使用pickle。這不適用於 ed numpy數組,以及內部中斷導致的錯誤。
我發現了Robert Kern的this reply,這似乎解決了同樣的問題。他建議爲imap
輸入來自內存映射陣列時創建一個特殊的代碼路徑:在生成的進程中手動存儲器映射相同的陣列。
這將是如此複雜和醜陋,我寧願生活在錯誤和額外的內存拷貝。修改現有代碼有沒有其他方法可以輕鬆一些?
喬你的答案總是搖滾。我一直在努力想出這樣的事情。 – YXD 2012-04-02 11:42:25
感謝HDF小費。看起來像一個巨大的變化,但它可能是值得的,我會檢查出來。 – user124114 2012-04-02 12:55:47