No exemplo visto em superfastpython.com , o tamanho de um segmento de memória compartilhada a ser usado para dar suporte a uma matriz numpy unidimensional é calculado como o número de elementos multiplicado pelo tamanho do tipo de dados.
Sabemos que o parâmetro de tamanho dado ao construtor SharedMemory é um minimum . Assim, em muitos casos, o tamanho real pode ser maior do que o especificado - e isso é bom.
Mas e se o tamanho especificado for um múltiplo exato do tamanho da página de memória subjacente?
Considere isto:
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()
Neste caso (Python 13.3.0 no macOS 15.0.1) o valor de s é 16.384, que é um múltiplo preciso do tamanho da página subjacente e, portanto, shm.size é igual a s
Talvez eu não saiba o suficiente sobre numpy, mas imaginei que o ndarray precisaria de mais espaço para estruturas internas/de gerenciamento.
Alguém pode explicar por que isso funciona e por que não há necessidade aparente de permitir espaço extra no segmento de memória compartilhada?