我正在使用多重处理处理存储在字典中的大量数据。基本上我所做的就是加载一些存储在字典中的签名,从中构建一个共享的 dict 对象(获取 Manager.dict() 返回的“代理”对象)并将此代理作为参数传递给具有在多处理中执行。
只是为了澄清:
signatures = dict()
load_signatures(signatures)
[...]
manager = Manager()
signaturesProxy = manager.dict(signatures)
[...]
result = pool.map ( myfunction , [ signaturesProxy ]*NUM_CORES )
现在,如果一切正常签名条目数少于 200 万条左右。不管怎样,我必须处理一个有 580 万个键的字典(pickling签名二进制格式生成 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 的机器上工作,运行 top 我发现该进程在加载签名后占用了 7GB RAM。然后它开始构建代理对象,RAM 使用量上升到约 17GB RAM,但从未接近 32。此时,RAM 使用量开始快速减少,并且该过程因上述错误而终止。所以我想这不是由于内存不足错误......
有什么想法或建议吗?
谢谢你,
Davide