マルチプロセッシングを使用して、辞書に保存されている非常に大量のデータを処理しています。基本的に私がしているのは、辞書に保存されているいくつかの署名をロードし、そこから共有dictオブジェクトを構築し(Manager.dict()によって返される'proxy'オブジェクトを取得)、このプロキシを引数として次の関数に渡すことです。マルチプロセッシングで実行されます。
明確にするために:
signatures = dict()
load_signatures(signatures)
[...]
manager = Manager()
signaturesProxy = manager.dict(signatures)
[...]
result = pool.map ( myfunction , [ signaturesProxy ]*NUM_CORES )
現在、署名が200万エントリ程度未満であれば、すべてが完全に機能します。とにかく、私は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
---------------------------------------------------------------------------
データ構造が巨大であることは知っていますが、32GBのRAMを搭載したマシンで作業しており、トップを実行すると、署名をロードした後、プロセスが7GBのRAMを占有していることがわかります。次に、プロキシオブジェクトの構築を開始し、RAM使用量は最大17GBのRAMになりますが、32に近づくことはありません。この時点で、RAM使用量は急速に減少し始め、プロセスは上記のエラーで終了します。したがって、これはメモリ不足エラーによるものではないと思います...
何かアイデアや提案はありますか?
ありがとうございました、
ダビデ