Quiero saber el uso de memoria de mi aplicación Python y específicamente quiero saber qué bloques de código / porciones u objetos consumen más memoria. La búsqueda de Google muestra que uno comercial es Python Memory Validator (solo Windows).
Y los de código abierto son PySizer y Heapy .
No he probado a nadie, así que quería saber cuál es el mejor teniendo en cuenta:
Da la mayoría de los detalles.
Tengo que hacer menos o ningún cambio en mi código.
python
performance
memory-management
profiling
Anurag Uniyal
fuente
fuente
Respuestas:
Heapy es bastante simple de usar. En algún momento de su código, debe escribir lo siguiente:
Esto le da un resultado como este:
También puede averiguar desde dónde se hace referencia a los objetos y obtener estadísticas al respecto, pero de alguna manera los documentos son un poco escasos.
También hay un navegador gráfico, escrito en Tk.
fuente
pip install https://guppy-pe.svn.sourceforge.net/svnroot/guppy-pe/trunk/guppy
boost::python
objetos, ¡sería bueno ver algunos ejemplos!Como nadie lo ha mencionado, señalaré mi módulo memory_profiler, que es capaz de imprimir informes línea por línea del uso de memoria y funciona en Unix y Windows (necesita psutil en este último). La salida no es muy detallada, pero el objetivo es darle una visión general de dónde el código consume más memoria y no un análisis exhaustivo de los objetos asignados.
Después de decorar su función
@profile
y ejecutar su código con la-m memory_profiler
bandera, imprimirá un informe línea por línea como este:fuente
memory_profiler
buffer almacena su salida? Puede que esté haciendo algo mal, pero parece que, en lugar de volcar el perfil para una función cuando se completa, espera a que finalice el script.Recomiendo Dowser . Es muy fácil de configurar y no necesita cambios en su código. Puede ver recuentos de objetos de cada tipo a través del tiempo, ver la lista de objetos vivos, ver referencias a objetos vivos, todo desde la interfaz web simple.
Importa memdebug y llama a memdebug.start. Eso es todo.
No he probado PySizer o Heapy. Agradecería las opiniones de los demás.
ACTUALIZAR
El código anterior es para
CherryPy 2.X
,CherryPy 3.X
elserver.quickstart
método se ha eliminado yengine.start
no toma lablocking
bandera. Entonces, si estás usandoCherryPy 3.X
fuente
Considere la biblioteca objgraph (verhttp://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks para un caso de uso de ejemplo).
fuente
objgraph.by_type('dict')
entender de dóndedict
provienen todos esos objetos inesperados .Muppy es (otro más) Memory Usage Profiler para Python. El enfoque de este conjunto de herramientas se basa en la identificación de pérdidas de memoria.
Muppy intenta ayudar a los desarrolladores a identificar fugas de memoria de las aplicaciones Python. Permite el seguimiento del uso de la memoria durante el tiempo de ejecución y la identificación de objetos con fugas. Además, se proporcionan herramientas que permiten localizar la fuente de objetos no liberados.
fuente
Estoy desarrollando un generador de perfiles de memoria para Python llamado memprof:
http://jmdana.github.io/memprof/
Le permite registrar y trazar el uso de memoria de sus variables durante la ejecución de los métodos decorados. Solo tiene que importar la biblioteca usando:
Y decora tu método usando:
Este es un ejemplo de cómo se ven las tramas:
El proyecto está alojado en GitHub:
https://github.com/jmdana/memprof
fuente
a
,b
yc
son los nombres de las variables. Puede encontrar la documentación en github.com/jmdana/memprof . Si tiene alguna pregunta, no dude en enviar un problema en github o enviar un correo electrónico a la lista de correo que se puede encontrar en la documentación.Encontré que las melias son mucho más funcionales que Heapy o PySizer. Si está ejecutando una aplicación web wsgi, entonces Dozer es un buen contenedor de middleware de Dowser
fuente
Pruebe también el proyecto pytracemalloc que proporciona el uso de memoria por número de línea de Python.
EDITAR (2014/04): ahora tiene una interfaz gráfica de usuario Qt para analizar instantáneas.
fuente
tracemalloc
ahora es parte de la biblioteca estándar de python. Ver docs.python.org/3/library/tracemalloc.html