【发布时间】:2011-05-30 21:35:12
【问题描述】:
我正在处理大量数据,存储在字典中,使用多重处理。基本上我所做的只是加载一些签名,存储在字典中,从中构建一个共享的 dict 对象(获取 Manager.dict() 返回的“代理”对象)并将这个代理作为参数传递给具有在多进程中执行。
澄清一下:
signatures = dict()
load_signatures(signatures)
[...]
manager = Manager()
signaturesProxy = manager.dict(signatures)
[...]
result = pool.map ( myfunction , [ signaturesProxy ]*NUM_CORES )
现在,如果 signatures 的条目少于 200 万个左右,则一切正常。无论如何,我必须处理具有 5.8M 键的字典(以二进制格式腌制 signatures 会生成一个 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 使用量开始迅速减少,进程因上述错误而终止。所以我猜这不是由于内存不足错误......
有什么想法或建议吗?
谢谢,
大卫
【问题讨论】:
标签: python dictionary multiprocessing shared-objects