Dav*_*e C 7 python dictionary shared-objects multiprocessing
我正在使用多处理处理存储在字典中的大量数据.基本上我正在做的是加载一些签名,存储在字典中,从中构建一个共享的dict对象(获取Manager.dict()返回的'proxy'对象)并将此代理作为参数传递给具有该函数的函数在多处理中执行.
只是为了澄清:
signatures = dict()
load_signatures(signatures)
[...]
manager = Manager()
signaturesProxy = manager.dict(signatures)
[...]
result = pool.map ( myfunction , [ signaturesProxy ]*NUM_CORES )
Run Code Online (Sandbox Code Playgroud)
现在,如果签名少于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
---------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
我知道这个数据结构是巨大的,但我的工作配备瓦特/ 32GB内存的机器上,并运行上面我看到这个过程中,加载后签名,占地RAM 7GB.然后,它开始建立代理对象和RAM使用率上升到内存17GB〜但从未得到接近32.在这一点上,内存使用开始迅速减少,过程与上面的错误而终止.所以我想这不是因为内存不足错误......
有什么想法或建议吗?
谢谢,
达维德
Gle*_*ard -2
如果字典是只读的,则在大多数操作系统中不需要代理对象。
只需在启动工作人员之前加载字典,并将它们放在可以访问的地方即可;最简单的地方是模块的全局。工作人员可以读取它们。
from multiprocessing import Pool
buf = ""
def f(x):
buf.find("x")
return 0
if __name__ == '__main__':
buf = "a" * 1024 * 1024 * 1024
pool = Pool(processes=1)
result = pool.apply_async(f, [10])
print result.get(timeout=5)
Run Code Online (Sandbox Code Playgroud)
这仅使用 1GB 的内存组合,而不是每个进程 1GB,因为任何现代操作系统都会对分叉之前创建的数据进行写时复制影子。请记住,其他工作人员不会看到对数据的更改,并且当然会为您更改的任何数据分配内存。
它将使用一些内存:包含引用计数的每个对象的页面将被修改,因此它将被分配。这是否重要取决于数据。
这适用于任何实现普通分叉的操作系统。它不适用于 Windows;它的(残缺的)流程模型需要为每个工作人员重新启动整个流程,因此它不太擅长共享数据。
| 归档时间: |
|
| 查看次数: |
4618 次 |
| 最近记录: |