为什么 python 的 SharedMemory 似乎将数组初始化为零
Why does python's SharedMemory seem to initialize arrays to zeros
我正在 python 中初始化一个 SharedMemory 以便在多个进程之间共享,我注意到它似乎总是充满了零(这很好),但我不明白为什么这是因为文档没有说明有一个默认值来填充内存。
这是我的测试代码,分两次打开 shells, shell 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')
shell 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 不初始化内存——它只是获取操作系统提供的虚拟内存地址。在 posix 系统上它使用 shm_open
, while on Windows its CreateFileMapping
。在 linux 和 windows 上,这些调用保证内存初始化为零。
让应用程序查看前一个用户恰好在 RAM 中的任何剩余数据将是一个安全漏洞,因此需要用一些东西填充它。但这不是 python 的保证,并且某些操作系统(可能是嵌入式 OS)可能不会那样做。
我正在 python 中初始化一个 SharedMemory 以便在多个进程之间共享,我注意到它似乎总是充满了零(这很好),但我不明白为什么这是因为文档没有说明有一个默认值来填充内存。
这是我的测试代码,分两次打开 shells, shell 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')
shell 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 不初始化内存——它只是获取操作系统提供的虚拟内存地址。在 posix 系统上它使用 shm_open
, while on Windows its CreateFileMapping
。在 linux 和 windows 上,这些调用保证内存初始化为零。
让应用程序查看前一个用户恰好在 RAM 中的任何剩余数据将是一个安全漏洞,因此需要用一些东西填充它。但这不是 python 的保证,并且某些操作系统(可能是嵌入式 OS)可能不会那样做。