python memory numpy memory-profiling

python - Perfilador de memoria para numpy



memory memory-profiling (1)

Tengo una numpy comandos numpy que, según la top , utiliza unos 5 GB de RAM:

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 16994 aix 25 0 5813m 5.2g 5.1g S 0.0 22.1 52:19.66 ipython

¿Hay un generador de perfiles de memoria que me permita tener una idea acerca de los objetos que están tomando la mayor parte de esa memoria?

He probado heapy , pero guppy.hpy().heap() me está dando esto:

Partition of a set of 90956 objects. Total size = 12511160 bytes. Index Count % Size % Cumulative % Kind (class / dict of class) 0 42464 47 4853112 39 4853112 39 str 1 22147 24 1928768 15 6781880 54 tuple 2 287 0 1093352 9 7875232 63 dict of module 3 5734 6 733952 6 8609184 69 types.CodeType 4 498 1 713904 6 9323088 75 dict (no owner) 5 5431 6 651720 5 9974808 80 function 6 489 1 512856 4 10487664 84 dict of type 7 489 1 437704 3 10925368 87 type 8 261 0 281208 2 11206576 90 dict of class 9 1629 2 130320 1 11336896 91 __builtin__.wrapper_descriptor <285 more rows. Type e.g. ''_.more'' to view.>

Por alguna razón, solo representa 12 MB de los 5 GB (la mayor parte de la memoria es casi seguramente utilizada por matrices numpy ).

¿Alguna sugerencia sobre lo que podría estar haciendo mal con heapy o qué otras herramientas debería probar (aparte de las que ya se mencionaron en este hilo )?


Numpy (y sus enlaces de biblioteca, más de eso en un minuto) usan C malloc para asignar espacio, por lo que la memoria utilizada por las grandes asignaciones de números no aparece en el perfil de cosas como heapy y nunca se limpia con la basura coleccionista.

Los sospechosos habituales de las grandes fugas son en realidad enlaces de bibliotecas suntuosos o adormecidos, en lugar del propio código de Python. Me quemé mal el año pasado por la interfaz scipy.linalg predeterminada para umfpack, que filtró la memoria a una velocidad de aproximadamente 10Mb por llamada. Es posible que desee probar algo como valgrind para perfilar el código. A menudo, puede dar algunas pistas sobre dónde mirar hacia dónde puede haber fugas.