【发布时间】:2020-12-23 01:10:37
【问题描述】:
在 Python 3.8+ 中,是否可以检查 numpy 数组是否存储在共享内存中?
在以下示例中,使用 multiprocessing.shared_memory.SharedMemory 对象的缓冲区创建了一个 numpy 数组 sharedArr。想知道能不能写个函数检测SharedMemory是否被使用。
import numpy as np
from multiprocessing import shared_memory
if __name__ == '__main__':
# Created numpy array `sharedArr`in shared memory
arr = np.zeros(5)
shm = shared_memory.SharedMemory(create=True, size=arr.nbytes)
sharedArr = np.ndarray(arr.shape, dtype=arr.dtype, buffer=shm.buf)
sharedArr[:] = arr[:]
# How to tell if numpy array is stored in shared memory?
print(type(sharedArr)) # <class 'numpy.ndarray'>
print(hex(id(sharedArr))) # 0x7fac99469f30
shm.close()
shm.unlink()
【问题讨论】:
-
hex(id(...))是一个巨大的红鲱鱼。这不是一个有用的方法来确定底层缓冲区发生了什么。id不 提供内存地址,这是一个 CPython 实现细节,它只是一个在对象的生命周期内保证唯一的数字。在这种情况下,它是np.ndarray对象的 PyObject 标头的地址,但这与缓冲区无关,实际上,您可以创建任意数量的numpy.ndarray具有不同id的对象共享同一个缓冲区
标签: python python-3.x numpy shared-memory sysv