我正在使用多处理处理存储在字典中的大量数据。基本上我所做的就是加载一些签名,存储在字典中,从中构建一个共享的 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 键的字典(二进制格式的 pickling 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,但从未接近 32GB。此时,RAM 使用量开始迅速减少,进程因上述错误而终止。所以我猜这不是由于内存不足错误...
有什么想法或建议吗?
谢谢,
大卫
最佳答案
你为什么不用数据库试试呢?数据库不限于可寻址/物理 ram,并且对于多线程/进程使用是安全的。
关于python:使用多处理共享巨大的字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4534687/