检查 Numpy 数组是否存储在共享内存中
Check if Numpy Array is Stored in Shared Memory
在 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()
在这种特殊情况下,您可以使用共享数组的 base
属性。 attribute 是对该数组从中派生其内存的基础对象的引用。对于大多数数组,这是 None
,表示这样的数组拥有它的数据。 运行 我机器上的这段代码表明这个数组的基数是一个 mmap
对象:
>>> sharedArr.base
<mmap.mmap at 0x11a4aa670>
如果您仍然引用从中分配数组的共享内存对象,您可以将数组的基址与共享内存段的内存映射进行比较:
>>> sharedArr.base is shm._mmap
True
如果你不有shm
对象,因为你不会在一个假设可以执行这个任务的独立函数中,我怀疑有一种便携且万无一失的方法。
由于 NumPy 提供了它自己的 memory-map object,因此对您的情况进行前一个检查可能就足够了。也就是说,假设如果数组由内置 Python 内存映射支持,则它是从共享内存分配的:
import mmap
def array_is_from_shared_memory(arr):
return isinstance(arr.base, mmap.mmap)
这在您的特定示例中有效,但您必须小心,清楚地记录它所做的假设,并测试它是否为您提供实际您在具体申请中需要的信息。
在 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()
在这种特殊情况下,您可以使用共享数组的 base
属性。 attribute 是对该数组从中派生其内存的基础对象的引用。对于大多数数组,这是 None
,表示这样的数组拥有它的数据。 运行 我机器上的这段代码表明这个数组的基数是一个 mmap
对象:
>>> sharedArr.base
<mmap.mmap at 0x11a4aa670>
如果您仍然引用从中分配数组的共享内存对象,您可以将数组的基址与共享内存段的内存映射进行比较:
>>> sharedArr.base is shm._mmap
True
如果你不有shm
对象,因为你不会在一个假设可以执行这个任务的独立函数中,我怀疑有一种便携且万无一失的方法。
由于 NumPy 提供了它自己的 memory-map object,因此对您的情况进行前一个检查可能就足够了。也就是说,假设如果数组由内置 Python 内存映射支持,则它是从共享内存分配的:
import mmap
def array_is_from_shared_memory(arr):
return isinstance(arr.base, mmap.mmap)
这在您的特定示例中有效,但您必须小心,清楚地记录它所做的假设,并测试它是否为您提供实际您在具体申请中需要的信息。