检查Numpy阵列是否存储在共享内存中

问题描述

在Python 3.8+中,是否可以检查numpy数组是否存储在共享内存中?

在下面的示例中,使用sharedArr对象的缓冲区创建了一个numpy数组multiprocessing.shared_memory.SharedMemory。想知道我们是否可以编写一个函数来检测是否使用了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)

这在您的特定示例中有效,但您必须对此小心,清楚记录其所作的假设,并测试它是否可以为您提供所需的实际信息确切的应用。