我正在使用多处理处理大量数据,存储在字典中。基本上我所做的只是加载一些签名,存储在字典中,从中构建一个共享的 dict 对象(获取 Manager.dict() 返回的“代理”对象)并将这个代理作为参数传递给具有在多进程中执行。
只是为了澄清:
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 的机器,运行 top 我看到加载签名后的进程占用 7GB 的 RAM。然后它开始构建代理对象,RAM 使用量上升到 ~17GB RAM,但从未接近 32。此时,RAM 使用量开始迅速减少,进程因上述错误而终止。所以我想这不是由于内存不足错误......
有什么想法或建议吗?
谢谢,
戴维德