[英]Free memory in shared memory dict
我使用 shared_memory_dict https://pypi.org/project/shared-memory-dict/我有一个类,它在里面创建一个共享内存字典
class A:
def __init__(self, id):
self.smd = SharedMemoryDict(name=id, size=1024)
def update(self, i):
self.smd[i] = i+1
def clean(self):
self.smd.shm.close()
self.smd.shm.unlink()
del self.smd
我创建了一个共享内存字典来管理我班级的所有实例
d = SharedMemoryDict(name='dict', size=1024)
for i in range(10):
d[i] = A(i)
for i in range(5):
d[i].update(i)
然后我想删除我的字典中的一个项目。 我尝试两种方法:
del d[0]
d[0].clean()
del d[0]
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
Input In [6], in <cell line: 2>()
1 d[0].clean()
----> 2 del d[0]
File /opt/anaconda/envs/python38/lib/python3.8/site-packages/shared_memory_dict/dict.py:102, in SharedMemoryDict.__delitem__(self, key)
101 def __delitem__(self, key: str) -> None:
--> 102 with self._modify_db() as db:
103 del db[key]
File /opt/anaconda/envs/python38/lib/python3.8/contextlib.py:113, in _GeneratorContextManager.__enter__(self)
111 del self.args, self.kwds, self.func
112 try:
--> 113 return next(self.gen)
114 except StopIteration:
115 raise RuntimeError("generator didn't yield") from None
File /opt/anaconda/envs/python38/lib/python3.8/site-packages/shared_memory_dict/dict.py:87, in SharedMemoryDict._modify_db(self)
84 @contextmanager
85 @lock
86 def _modify_db(self) -> Generator:
---> 87 db = self._read_memory()
88 yield db
89 self._save_memory(db)
File /opt/anaconda/envs/python38/lib/python3.8/site-packages/shared_memory_dict/dict.py:184, in SharedMemoryDict._read_memory(self)
183 def _read_memory(self) -> Dict[str, Any]:
--> 184 return self._serializer.loads(self._memory_block.buf.tobytes())
File /opt/anaconda/envs/python38/lib/python3.8/site-packages/shared_memory_dict/serializers.py:50, in PickleSerializer.loads(self, data)
48 def loads(self, data: bytes) -> dict:
49 try:
---> 50 return pickle.loads(data)
51 except pickle.UnpicklingError:
52 raise DeserializationError(data)
File /opt/anaconda/envs/python38/lib/python3.8/multiprocessing/shared_memory.py:102, in SharedMemory.__init__(self, name, create, size)
100 else:
101 name = "/" + name if self._prepend_leading_slash else name
--> 102 self._fd = _posixshmem.shm_open(
103 name,
104 self._flags,
105 mode=self._mode
106 )
107 self._name = name
108 try:
FileNotFoundError: [Errno 2] No such file or directory: '/sm_0'
删除该项目的正确方法是什么?
我找到了解决方案。 我没有在类内部创建共享内存,而是在外部创建共享内存并传递其名称来启动类。 update()
函数需要加载现有内存,更新其值并关闭()。 然后我可以删除实例并在外部释放共享内存而没有错误
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.