gpt4 book ai didi

python - 检查Numpy数组是否存储在共享内存中

转载 作者:行者123 更新时间:2023-12-04 01:14:44 26 4
gpt4 key购买 nike

在 Python 3.8+ 中,是否可以检查 numpy 数组是否存储在共享内存中?
在下面的例子中,一个 numpy 数组 sharedArr是使用 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)
这适用于您的特定示例,但您必须小心使用它,清楚地记录它所做的假设,并测试它是否为您提供了在您的确切应用程序中所需的实际信息。

关于python - 检查Numpy数组是否存储在共享内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63729692/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com