python - 检查 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
共享数组的属性。该属性是对该数组从中派生其内存的基础对象的引用。这适用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)
这在您的特定示例中有效,但您必须小心,清楚地记录它所做的假设,并测试它是否为您提供了您在确切应用程序中所需的实际信息。
推荐阅读
- javascript - Javascript 函数返回 NaN,可能是范围问题
- xml - 如何从多个 XSD 创建单个 xml 文件
- php - PHP 自定义 404 页面不再适用于 Chrome 浏览器
- rest - 如何向 Azure 中正在运行的 docker 容器发送 HTTP 请求
- android - Android Studio 迫使我使用 android.media import 而不是 google.play FaceDetector
- alamofire - Swift 4.2 Alamofire:调用中的额外参数“方法”
- amazon-web-services - AWS 云形成 - 使用安全组名称创建 EC2 实例
- angular - Angular6:如何将模板变量链接到服务的数组,索引在 paramMap
- python - 使用 for 和 while 循环编写素数函数的最 Pythonic 方式是什么?
- ruby-on-rails - 在 Ruby 中的表单内调用另一个控制器