Uno de mis alumnos me mostró el siguiente caso de prueba que muestra una aparente pérdida de memoria en NumPy. Me pregunto si el generador de perfiles de memoria es correcto aquí o qué está pasando. Aquí está el caso de prueba:
from memory_profiler import profile import numpy as np import gc @profile def test(): arr = np.ones((10000, 6912)) for i in range(2000): arr[0:75,:] = np.ones((75, 6912)) del arr gc.collect() pass test()Esto produce la siguiente salida:
Filename: test.py Line # Mem usage Increment Occurences Line Contents ============================================================ 5 32.9 MiB 32.9 MiB 1 @profile 6 def test(): 7 560.3 MiB 527.4 MiB 1 arr = np.ones((10000, 6912)) 8 564.2 MiB 0.0 MiB 2001 for i in range(2000): 9 564.2 MiB 3.9 MiB 2000 arr[0:75,:] = np.ones((75, 6912)) 10 37.0 MiB -527.3 MiB 1 del arr 11 37.0 MiB -0.0 MiB 1 gc.collect() 12 37.0 MiB 0.0 MiB 1 pass Parece que la línea con np.ones((75, 6912)) está perdiendo memoria lentamente (alrededor de 4 MB aquí). Si reemplazamos esta expresión con solo 1 , entonces la fuga aparente desaparece.
Probé esto en Python 3.8.10 y 3.9.5 con Numpy versiones 1.21.3 (más reciente al momento de escribir) y 1.20.3 y memory_profiler versión 0.58.0 (más reciente al momento de escribir). Mi sistema operativo es Ubuntu Linux 20.04 LTS; mi estudiante demostró esto en macOS (no estoy seguro de qué versión).
¿Qué está sucediendo?