首页 > 解决方案 > 检查 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()

标签: pythonpython-3.xnumpyshared-memorysysv

解决方案


在这种特殊情况下,您可以使用base共享数组的属性。该属性是对该数组从中派生其内存的基础对象的引用。这适用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)

这在您的特定示例中有效,但您必须小心,清楚地记录它所做的假设,并测试它是否为您提供了您在确切应用程序中所需的实际信息。


推荐阅读