2010-04-20 11 views
8

Estoy trabajando para resolver una pérdida de memoria en mi aplicación Python.Python - Memory Leak

Esto es lo que sucede: parece que solo sucede en Windows Server 2008 (no en R2) pero no en versiones anteriores de Windows, y tampoco parece que esté sucediendo en Linux (aunque no lo hice casi como muchas pruebas en Linux).

Para solucionarlo, I fijó la depuración en el recolector de basura:

gc.set_debug(gc.DEBUG_UNCOLLECTABLE | gc.DEBUG_INSTANCES | gc.DEBUG_OBJECTS) 

Luego, periódicamente, que registrará el contenido de gc.garbage.

Thing is, gc.garbage está siempre vacío, pero el uso de mi memoria aumenta y aumenta.

Muy desconcertante.

+9

Dave, claramente su problema puede solucionarse eliminando la línea 123 .... y agregue un i = 1 en la línea 27 ... –

+0

en serio, creo que para ayudarlo necesitamos algún código .. –

+1

Semi-duplicado (o puede ser un hilo interesante para leer para usted): http://stackoverflow.com/questions/1435415/python-memory-leaks/1435426#1435426 (si esto no funciona, vuelva con los detalles) – ChristopheD

Respuesta

2

Mejor tarde que nunca. Resolvió esto bastante rápido pero se olvidó de publicar la respuesta. Terminamos arrancando el código Twisted y usando CherryPy en su lugar.Es mucho más ligero, más fácil de usar y ya no parece suceder. Es probable que fuera nuestra culpa que estuviera sucediendo y no de Twisted, pero el código era tan malo que decidimos reescribirlo, sería más fácil.

+0

esto no es una respuesta –

26

Si nunca hay basura en gc.garbage, no estoy seguro de lo que intenta hacer habilitando la depuración de GC. Claro, le dirá qué objetos se consideran para la limpieza, pero eso no es particularmente interesante si termina sin referencias circulares que no se pueden limpiar.

Si el programa está utilizando cada vez más memoria de acuerdo con el sistema operativo, no puede ser generalmente cuatro casos diferentes en juego:

  1. Su aplicación está almacenando más y más cosas, mantener las referencias a cada uno por lo que no ser recogido
  2. Su aplicación es la creación de referencias circulares entre los objetos que no se pueden limpiar por el módulo gc (por lo general debido a que uno de ellos tiene un método __del__.)
  3. Su aplicación es liberar (y re-uso de) la memoria, pero el sistema operativo no quiere que se reutilice la memoria, por lo que sigue asignando nuevos bloques de memoria.
  4. La fuga es una pérdida de memoria real pero en un módulo de extensión C/C++ que está usando su código.

Desde su descripción suena como que es poco probable que sea # 1 (como se comportaría de la misma en cualquier sistema operativo) y al parecer no # 2, bien (ya que no hay nada en gc.garbage.) Teniendo en cuenta # 3, Windows (en general) tiene un asignador de memoria que es notoriamente malo con las asignaciones fragmentadas, pero Python lo soluciona con su interfaz obmalloc para malloc(). Todavía puede ser un problema específico de las bibliotecas del sistema de Windows Server 2008 que hace que parezca que su aplicación está usando más y más memoria. O puede ser un caso de # 4, un módulo de extensión C/C++ o una DLL utilizada por Python o un módulo de extensión, con una pérdida de memoria.

3

En general, el primer culpable de fugas de memoria en python se encuentra en C extensiones.
¿Utiliza alguno de ellos?

Además, dices que el problema ocurre solo en 2008; Luego verificaba las extensiones por cualquier incompatibilidad, porque con Vista y 2008 hubo bastantes pequeños cambios que causaron problemas en ese campo.
Como alternativa, intente ejecutar su aplicación en el modo de compatibilidad de Windows, eligiendo Windows XP; esto podría ayudar a resolver el problema, especialmente si está relacionado con cambios en la seguridad.