从python中的共享内存字典加载

时间:2018-07-16 21:08:38

标签: python python-2.7 dictionary multiprocessing shared-memory

我试图读取共享字典元素并将其输出到文件。但是我测试无法访问共享字典,它将返回错误。

我编写了以下代码,但仅当未共享字典对象时才有效(如我所评论)。

有人可以建议如何访问共享内存字典吗?

import multiprocessing as mp

sharedi = mp.Manager().dict()
#sharedi = {}
l1 = ['a','b','c','d']
l2 = ['b','b','c','e']

for i in range(0,2):
    name = "abc"+str(i)
    sharedi.update({name:[l1,l2]})

def writ(dirname):
    outfile = open(dirname,'w')
    for i in sharedi:
        for object in sharedi[i][0]:
            outfile.write(object)

print sharedi
p1 = mp.Process(target = writ,args=('d1',))
p2 = mp.Process(target = writ,args=('d2',))

p1.start()
p2.start()
# adding join() as suggeseted in the comment
p1.join()
p2.join()

我希望将共享字典写入文件,这是我收到的错误消息:

Process Process-3:
Process Process-2:
Traceback (most recent call last):
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py", line 114, in run
    self.run()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "dict.py", line 14, in writ
    self._target(*self._args, **self._kwargs)
  File "dict.py", line 14, in writ
    for i in sharedi:
    for i in sharedi:
  File "<string>", line 2, in __getitem__
  File "<string>", line 2, in __getitem__
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/managers.py", line 755, in _callmethod
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/managers.py", line 755, in _callmethod
    self._connect()
    self._connect()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/managers.py", line 742, in _connect
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/managers.py", line 742, in _connect
    conn = self._Client(self._token.address, authkey=self._authkey)
    conn = self._Client(self._token.address, authkey=self._authkey)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/connection.py", line 169, in Client
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/connection.py", line 169, in Client
    c = SocketClient(address)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/connection.py", line 308, in SocketClient
    c = SocketClient(address)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/connection.py", line 308, in SocketClient
    s.connect(address)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 228, in meth
    s.connect(address)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 228, in meth
    return getattr(self._sock,name)(*args)
error: [Errno 2] No such file or directory
    return getattr(self._sock,name)(*args)
error: [Errno 2] No such file or directory

编辑:

按照注释中的建议进行添加,但仍然出现错误...

p1.join()
p2.join()

下面是错误消息

Process Process-2:
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
Process Process-3:
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "dict.py", line 14, in writ
    self.run()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "dict.py", line 14, in writ
    for i in sharedi:
  File "<string>", line 2, in __getitem__
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/managers.py", line 774, in _callmethod
    for i in sharedi:
  File "<string>", line 2, in __getitem__
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/managers.py", line 774, in _callmethod
    raise convert_to_error(kind, result)
KeyError: 0
    raise convert_to_error(kind, result)
KeyError: 0

更新:我刚刚搜索并意识到我不能(也许)迭代一个共享字典对象。一种迭代方法是再次将其转换为普通字典。但是在我要编写的程序中,这将占用大量内存(每个字典大约是4G)。还有其他方法可以迭代共享的dict对象吗?

0 个答案:

没有答案