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?
Um array tem um monte de metadados que ocupam um monte de espaço extra, mas esses metadados são armazenados separadamente do seu buffer de dados. A memória compartilhada que você está alocando é apenas para o buffer de dados.