2011-08-09 21 views
29

Estoy buscando generar, a partir de una gran base de código de Python, un resumen del uso de heap o las asignaciones de memoria en el transcurso de la ejecución de una función.Analizador de memoria de línea por línea Python?

Estoy familiarizado con heapy, y me ha servido para tomar "instantáneas" del montón en puntos particulares de mi código, pero me ha resultado difícil generar un resumen de "memoria en el tiempo" con eso. También jugué con line_profiler, pero eso funciona con tiempo de ejecución, no con memoria.

Mi recuperación ahora es Valgrind con massif, pero eso carece de mucha información contextual de Python que ofrecen Heapy y line_profiler. ¿Hay algún tipo de combinación de estos dos últimos que den una sensación de uso de la memoria o crecimiento del montón durante el período de ejecución de un programa de Python?

+0

¿Podría hacerlo con http://docs.python.org/devguide/gdb.html, si lo que le importa está sucediendo en el mundo C? – agf

+0

Una perspectiva de C estaría bien, si hubiera una forma de ejecutar un gdb automáticamente a intervalos regulares, ¿existe ese método? – Tim

+1

Una buena pregunta, me interesa saber, así que agregué una recompensa. – bgw

Respuesta

13

Usaría sys.settrace al iniciar el programa para registrar una función de marcador personalizada. Se llamará a la función custom_trace para cada línea de código. Luego puede usar esa función para almacenar información recopilada por Heapy o meliae en un archivo para su posterior procesamiento.

Aquí es un ejemplo muy sencillo que registra la salida de hpy.heap() cada segundo a un archivo de texto plano:

import sys 
import time 
import atexit 
from guppy import hpy 

_last_log_time = time.time() 
_logfile = open('logfile.txt', 'w') 

def heapy_profile(frame, event, arg): 
    currtime = time.time() 
    if currtime - _last_log_time < 1: 
     return 
    _last_log_time = currtime 
    code = frame.f_code 
    filename = code.co_filename 
    lineno = code.co_firstlineno 
    idset = hpy().heap() 
    logfile.write('%s %s:%s\n%s\n\n' % (currtime, filename, lineno, idset)) 
    logfile.flush() 

atexit.register(_logfile.close) 
sys.settrace(heapy_profile) 
+1

No lo he probado * todavía *, pero parece que podríamos tener un ganador. (Esperaré hasta el final del período de recompensa para otorgar los puntos, en caso de que alguien más quiera dar una oportunidad a esta pregunta) – bgw

Cuestiones relacionadas