Una forma de resolver el problema si llama a muchas funciones diferentes y no está seguro de dónde proviene el intercambio sería utilizar la nueva funcionalidad de trazado de memory_profiler. Primero debe decorar las diferentes funciones que está utilizando con @profile. Por simplicidad usaré el ejemplo examples/numpy_example.py enviado con memory_profiler que contiene dos funciones: create_data()
y process_data()
Para ejecutar la secuencia de comandos, en lugar de ejecutarlo con el intérprete de Python, utiliza el ejecutable mprof, es decir
$ mprof run examples/numpy_example.py
Esto creará un archivo llamado mprofile_??????????.dat
, donde? sostendrá números que representan la fecha actual. Para trazar el resultado, simplemente escriba mprof plot
y generará una trama similar a esto (si tiene varios archivos .dat que siempre tendrá la última):
Aquí puede ver el consumo de memoria, con corchetes que indican cuándo ingresa/abandona la función actual. De esta forma, es fácil ver que la función process_data()
tiene un pico de consumo de memoria. Para profundizar en su función, puede utilizar el generador de perfiles línea por línea para ver el consumo de memoria de cada línea en su función.Esto se ejecuta con
python -m memory_profiler examples/nump_example.py
Esto le daría una salida similar a la siguiente:
Line # Mem usage Increment Line Contents
================================================
13 @profile
14 223.414 MiB 0.000 MiB def process_data(data):
15 414.531 MiB 191.117 MiB data = np.concatenate(data)
16 614.621 MiB 200.090 MiB detrended = scipy.signal.detrend(data, axis=0)
17 614.621 MiB 0.000 MiB return detrended
donde es claro que scipy.signal.detrend está asignando una gran cantidad de memoria.
no su (buena) pregunta, pero por supuesto puede utilizar una gran cantidad de dtype = np.float32 /. astype (np.float32) para flotantes de 32 bits en lugar de 64 bits. (Tenga cuidado con las funciones que silenciosamente hacen 32 en -> 64 fuera). – denis