在superfastpython.com上看到的示例中,用于支持一维 numpy 数组的共享内存段的大小计算为元素数量乘以数据类型大小。
我们知道,传递给 SharedMemory 构造函数的 size 参数是最小值。因此,在许多情况下,实际大小可能大于指定的大小 - 这很正常。
但是如果指定的大小是底层内存页面大小的精确倍数怎么办?
考虑一下:
import numpy as np
from multiprocessing.shared_memory import SharedMemory
n = 2048
s = n * np.dtype(np.double).itemsize
shm = SharedMemory(create=True, size=s)
try:
assert s == shm.size
a = np.ndarray((n,), dtype=np.double, buffer=shm.buf)
a.fill(0.0)
finally:
shm.close()
shm.unlink()
在这种情况下(macOS 15.0.1 上的 Python 13.3.0),s的值为 16,384,恰好是底层页面大小的精确倍数,因此 shm.size 等于s
也许我对 numpy 了解不够,但我会想象 ndarray 需要更多空间用于内部/管理结构。
有人可以解释一下为什么这样做有效,以及为什么显然不需要在共享内存段中留出额外的空间吗?