python:使用多处理共享巨大的字典

标签 python dictionary multiprocessing shared-objects

我正在使用多处理处理存储在字典中的大量数据。基本上我所做的就是加载一些签名,存储在字典中,从中构建一个共享的 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/

相关文章:

python - HTTP删除与python请求模块

添加许多叠加层后,android map 移动缓慢

python - 为什么我的 python 脚本在 if __name__==__main__ 运行时继续运行?

dictionary - YAML:具有空值的字典

c - 为什么我不能用这个c代码杀死进程组?

c++ - 在 C 中 fork child 并在他们死亡时重新 fork

python - 读取文件行数的更快方法

python - 加入 string 和 tf.string 以获取路径

python - 为什么 format(str(var)) 给我的 os.system 属性错误

python - 如何使用默认 key :value pairs given in another dict 更新 python 字典