【问题标题】:Why does python's SharedMemory seem to initialize arrays to zeros为什么 python 的 SharedMemory 似乎将数组初始化为零
【发布时间】:2021-12-27 17:23:41
【问题描述】:

我在 python 中初始化一个 SharedMemory 以在多个进程之间共享,我注意到它似乎总是用零填充(这很好),但我不明白为什么会发生这种情况作为文档没有说明有一个默认值来填充内存。

这是我的测试代码,在两个单独的电源外壳中打开,外壳 1:

import numpy as np
from multiprocessing.shared_memory import SharedMemory
def get_array_nbytes(rows, cols, dtype):
    array = np.zeros((rows, cols), dtype=dtype)
    nbytes = array.nbytes
    del array
    return nbytes

rows = 10000000
depths_columns = 18
array_sm = SharedMemory(create=True, size=get_array_nbytes(rows, depths_columns, np.float32), name='array_sm')

外壳 2:

from multiprocessing.shared_memory import SharedMemory
import numpy as np
array_sm = SharedMemory("depths_array")
array = np.ndarray((rows, 18), dtype=np.float32, buffer=array_sm.buf)

现在您可以在第二个 shell 中跟进:

array[0]
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0.], dtype=float32)

np.where(array != 0)
(array([], dtype=int64), array([], dtype=int64))

这种行为是否总是如此,还是只是侥幸?后台是否有某种未记录的初始化为零?

【问题讨论】:

    标签: python numpy shared-memory


    【解决方案1】:

    这取决于操作系统。 Python 不会初始化内存——它只需要操作系统提供的虚拟内存地址。在 posix 系统上它使用shm_open,而在 Windows 上它使用CreateFileMapping。在 linux 和 windows 上,这些调用保证内存初始化为零。

    如果让应用程序看到之前用户在 RAM 中的任何剩余数据,这将是一个安全漏洞,因此需要填充一些内容。但这不是 python 的保证,并且某些操作系统(可能是嵌入式操作系统)可能不会那样做。

    【讨论】:

      猜你喜欢
      • 2014-04-06
      • 1970-01-01
      • 2013-08-07
      • 1970-01-01
      • 1970-01-01
      • 2019-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多