共享内存中的自由记忆dict

发布于 2025-02-04 14:57:05 字数 3179 浏览 1 评论 0原文

我使用shared_memory_dict https://pypi.org/project/project/project/project/shared-memory-dict/ 我有一个类,可以在内部创建共享内存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

我创建了一个共享内存,以便向管理员的所有实例dict dict dict dict dict of class的所有实例

d = SharedMemoryDict(name='dict', size=1024)
for i in range(10):
    d[i] = A(i)
for i in range(5):
    d[i].update(i)

,然后我想在dict中删除一个项目。我尝试2种方法:

  1. 直接删除D [0],内部的共享存储器首先不关闭,并且
del d[0]
  1. 首先是免费的共享内存,然后删除项目。它导致下面导致错误:
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'

删除该项目的正确方法是什么?

I use shared_memory_dict https://pypi.org/project/shared-memory-dict/
I have a class, that create a shared memory dict inside

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

I create a shared memory dict to manager all instances of my class

d = SharedMemoryDict(name='dict', size=1024)
for i in range(10):
    d[i] = A(i)
for i in range(5):
    d[i].update(i)

Then i want to delete an item in my dict. I try 2 ways:

  1. Delete directly d[0], the shared memory inside is not be close and unlink
del d[0]
  1. Free shared memory first, then delete item. It leads to error below:
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'

What is the proper way to delete that item?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

漆黑的白昼 2025-02-11 14:57:05

我找到了一个解决方案。我没有在课堂内创建共享内存,而是在外面创建共享内存,然后将其名称传递以启动类。 update()功能需要加载现有内存,更新其值并关闭()。然后,我可以删除实例并在外面释放共享内存,而无需任何错误

I found a solution. Instead of creating share memory inside a class, I create share memory outside and just pass its name to initiate the class. The update() function need to load existing memory, update its value and close(). Then I can delete the instance and free the shared memory outside with no error

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文