私はマルチプロセッシングを使って辞書に格納された非常に大量のデータを処理しています。基本的に私がやっていることは、ディクショナリに保存されているシグネチャを読み込んで、そこから共有ディクテーションオブジェクトを作成して(Manager.dict()によって返された 'プロキシ'オブジェクトを取得する)、このプロキシを引数として関数に渡しますマルチプロセッシングで実行されます。ただ、明確にするPython:マルチプロセッシングを使って巨大な辞書を共有する
:署名が2つの未満で100万エントリまたはそうであれば
今signatures = dict()
load_signatures(signatures)
[...]
manager = Manager()
signaturesProxy = manager.dict(signatures)
[...]
result = pool.map (myfunction , [ signaturesProxy ]*NUM_CORES)
、すべてが完璧に動作します。とにかく、私は5.8Mのキーで辞書を処理する必要があります(の署名のバイナリ形式で4.8 GBのファイルが生成されます)。この場合、プロセスは、プロキシオブジェクトの作成中に死ぬ:
Traceback (most recent call last):
File "matrix.py", line 617, in <module>
signaturesProxy = manager.dict(signatures)
File "/usr/lib/python2.6/multiprocessing/managers.py", line 634, in temp
token, exp = self._create(typeid, *args, **kwds)
File "/usr/lib/python2.6/multiprocessing/managers.py", line 534, in _create
id, exposed = dispatch(conn, None, 'create', (typeid,)+args, kwds)
File "/usr/lib/python2.6/multiprocessing/managers.py", line 79, in dispatch
raise convert_to_error(kind, result)
multiprocessing.managers.RemoteError:
---------------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/lib/python2.6/multiprocessing/managers.py", line 173, in handle_request
request = c.recv()
EOFError
---------------------------------------------------------------------------
私がいることがわかり、私はデータ構造が巨大である知っているが、私はRAMの32ギガバイト/ wを搭載したマシンで作業し、トップを実行していますよ署名をロードした後のプロセスは、7GBのRAMを占有します。その後、プロキシオブジェクトの構築が開始され、RAMの使用量は最大17GBのRAMになりますが、32に近づくことはありません。この時点で、RAM使用率は急速に低下し始め、プロセスは上記のエラーで終了します。だから私はこれがメモリ不足のエラーのためではないと思います...
アイデアや提案はありますか?
は、システムレベルの問題を時間を節約し、デバッグを持っていないの関心では、ダヴィデ
これはWindows 7で動作しますか(現代のOSは間違いありません) –
@Seun:わかりません。それをテストしてみてください。私は、そのプロセスモデルが以前のバージョンよりも現代的であるとは思っていません。 Windowsはこれまで暗黒時代を迎えていました。 –
(無作為な、無作為なdownvotesのためにSOのようなものはありません) –