私はPythonのmultiprocessing
モジュールを使用して、大量のnumpy配列を並列に処理しています。配列は、マスタプロセスでnumpy.load(mmap_mode='r')
を使用してメモリマップされます。その後、multiprocessing.Pool()
がプロセスをフォークします(私は推測します)。 <bound method memmap.__del__ of memmap([ 0.57735026, 0.57735026, 0.57735026, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ], dtype=float32)>
に中NumPyとマルチプロセッシングとmmap
を無視
はAttributeError( " 'NoneType' オブジェクトが属性を持っていない '伝える'"):
すべてが同様に私はラインを取得しています除き、正常に動作するようですunittestログ。それでもテストはうまくいく。
何が起こっているのでしょうか?
Python 2.7.2、OS X、NumPy 1.6.1を使用しています。
UPDATE:
いくつかのデバッグした後、私は(の小さなスライスに)
Pool.imap
コールへの入力として、このメモリマップnumpyのアレイを使用していたコードパスに原因を追い詰め。「問題」は、
multiprocessing.Pool.imap
が入力を新しいプロセスに渡す方法であることが明らかです。それはpickleを使用します。これはmmap
edpy配列では機能せず、エラーの原因となるブレーク内の何かが発生します。私はthis replyで、同じ問題を解決すると思われるRobert Kernが見つかりました。彼は、
imap
の入力がメモリマップされた配列から来たときに特別なコードパスを作成することを提案しています。生成されたプロセスで同じ配列を手動でメモリマッピングします。これは非常に複雑で醜いので、私はむしろエラーと余分なメモリコピーで暮らしています。既存のコードを変更する上で軽い他の方法はありますか?
あなたの答えは常に揺れます。私はちょうどこれのようなものを理解しようとしてきました。 – YXD
HDFチップをありがとう。広大な変化のように見えるが、価値があるかもしれないが、私はそれをチェックする。 – user124114