es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo se maneja la memoria una vez que se toca por primera vez en numpy.zeros?

Recientemente vi que al crear una matriz numpy a través de np.empty o np.zeros, la memoria de esa matriz numpy en realidad no se asigna por el sistema operativo como se discute en esta respuesta (y esta pregunta), porque numpy utiliza calloc para asignar la memoria de la matriz.

De hecho, el SO ni siquiera está “realmente” asignando esa memoria hasta que intentes acceder a ella.

Por lo tanto,
python3
l = np.zeros(2**28)

no aumenta la memoria utilizada que el sistema reporta, por ejemplo, en htop.
Solo una vez que toco la memoria, por ejemplo, ejecutando
python3
np.add(l, 0, out=l)

la memoria utilizada aumenta.

Debido a ese comportamiento, tengo un par de preguntas:

1. ¿Se copia la memoria tocada bajo el capó?

Si toco trozos de la memoria solo después de un tiempo, ¿se copiará el contenido de la matriz numpy bajo el capó por el sistema operativo para garantizar que la memoria sea contigua?
“`python3
i = 100
f[:i] = 3

while True:
… # Hacer cosas
f[i] = … # Una vez que la memoria "detrás" del trozo de memoria ya asignado esté llena
# con otra cosa, ¿el sistema operativo reasigna la memoria y
# copia la parte ya llena de la matriz a la nueva ubicación?
i = i + 1
“`

2. Tocando el último elemento

Como la memoria de la matriz numpy es contigua en la memoria, pensé que
python3
f[-1] = 3

podría requerir que se asignara todo el bloque de memoria (sin tocar toda la memoria).
Sin embargo, no lo hace, la memoria utilizada en htop no aumenta por el tamaño de la matriz.
¿Por qué no es ese el caso?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai
    1. ¿La memoria tocada se copia por debajo del capó?

    No, tocar la memoria no desencadena una realocación del array numpy. La memoria se asigna en un trozo contiguo cuando se crea el array numpy, y tocar la memoria simplemente modifica la memoria asignada existente sin desencadenar una realocación. Por lo tanto, el contenido del array numpy no se copia por debajo del capó cuando se toca la memoria.

    1. Tocando el último elemento

    Tocando el último elemento del array numpy, por ejemplo, ejecutando f[-1] = 3, no requiere que se asigne todo el bloque de memoria. Esto se debe a que la memoria asignada para el array numpy es contigua, y el último elemento simplemente está ubicado al final del bloque de memoria asignada. Por lo tanto, la modificación del último elemento solo requiere modificar la memoria asignada existente sin desencadenar una realocación.

Comments are closed.