2011-07-24 14 views
6

De alguna manera la memoria de mi programa Python toma más y más memoria a medida que se ejecuta (la VIRTURA y RES) la columna del comando "superior" sigue aumentando.¿La memoria de Python pierde el seguimiento?

Sin embargo, revisé mi código con mucha atención y estoy seguro de que no hay pérdidas de memoria (no usé ningún diccionario, no hay variables globales. Es solo un método principal para llamar a un método secundario varias veces))

que utilizan heapy al perfil de mi uso de la memoria por

from guppy import hpy; 
heap = hpy(); 
..... 
print heap.heap(); 

cada vez que el principal método llama al método sub. Sorprendentemente, siempre da el mismo resultado. Pero el uso de la memoria simplemente sigue creciendo.

Me pregunto si no he usado Heapy, o VIRT y RES en el comando "superior" no reflejan realmente la memoria que usa mi código.

¿O alguien puede proporcionar una mejor manera de rastrear el uso de la memoria en una secuencia de comandos de Python?

¡Muchas gracias!

+1

Parece que el submétodo está goteando. Suponiendo que tiene acceso a su código, intente con [sys.getsizeof (object) or else pysizer] (http://stackoverflow.com/questions/449560/how-do-i-determine-the-size-of-an-object -in-python) para medir objetos dentro del submetodo. – smci

Respuesta

1

dos casos posibles:

  • su función es puro Python, en cuyo caso las posibles causas incluyen

    • está almacenando un número creciente de grandes objetos
    • que está teniendo ciclos de objetos con un método __del__, que el gc no tocará

    Sugiero usar el módulo gc y las funciones gc.garbage y gc.get_objects (ver http://docs.python.org/library/gc.html#module-gc), para obtener una lista de objetos existentes, y luego puede introspeccionarlos mirando el atributo __class__ de cada objeto, por ejemplo, para obtener información sobre el objeto clase.

  • su función está escrita al menos parcialmente en C/C++, en cuyo caso el problema es potencialmente en ese código. El consejo anterior aún se aplica, pero no podrá ver todas las filtraciones: verá las pérdidas causadas por llamadas perdidas a PY_DECREF, pero no las asignaciones C/C++ de bajo nivel sin una desasignación correspondiente. Para esto, necesitarás valgrind. Consulte this question para obtener más información sobre ese tema

Cuestiones relacionadas