2009-02-10 13 views
30

Duplicar posible:
Python memory profiler¿Cómo puedo encontrar pérdidas de memoria en mi programa Python?

tengo una línea de programa Python bastante complejo (alrededor de 20.000), que después de un cierto desarrollo ha comenzado a consumir cada vez mayores cantidades de memoria cuando se ejecuta. ¿Cuáles son las mejores herramientas y técnicas para descubrir para qué se usa toda la memoria?

Por lo general, esto se debe a referencias inesperadas a objetos o errores del módulo de extensión (que no es particularmente probable ya que hemos estado usando la instalación de Python 2.4 por un tiempo).

Estamos utilizando varias bibliotecas de terceros como Twisted, Twisted Conch y MySQLdb.

+1

cerrar - este es un duplicado –

+0

Ya había una [pregunta] (http://stackoverflow.com/questions/110259/python-memory-profiler/110826) sobre este tema. – Seb

Respuesta

1

La memoria de Python es administrada por un recolector de basura. En general, no debería haber un problema con la pérdida de memoria (definitivamente no para Python2.5 y superior), a menos que esté escribiendo módulos de extensión en C/C++. En ese caso, Valgrind (Publicación del blog - http://bruynooghe.blogspot.com/2008/12/finding-memory-leaks-in-python.html) podría ser útil. Descubrí que esta persona - http://mg.pov.lt/blog/hunting-python-memleaks ha usado PDB y matplotlib para rastrear una fuga de memoria. Espero que esto ayude, no tengo experiencia en arreglar fugas de memoria de Python.

+15

En un programa complejo, a veces mantendrá una referencia a un objeto sin darse cuenta. Esto hace que el recolector de basura no pueda reclamar la memoria. La forma en que la pregunta a la que Sebastjan se relacionó es mejor; lo que realmente quiero es ver dónde se está usando mi memoria. –

+0

Gracias por el comentario Dickon. Lo tendré en mente. – batbrat

14

Generalmente, no cerrar los cursores es uno de los tipos más comunes de pérdida de memoria. El recolector de basura no puede ver los recursos de MySQL involucrados en el cursor. MySQL no sabe que el lado de Python fue lanzado a menos que se llame explícitamente al método close().

Regla de oro. Abra, use y cierre los cursores en un lapso de código tan breve como pueda.

+0

He estado tratando de descubrir por qué mi sistema no liberará recursos en un programa, y ​​eso fue exactamente. Algo tan pequeño, pero cuando se hacen miles de consultas DB, ¡se vuelve muy rápido! – Shakesbeery

+0

Parece que debería usar una instrucción with y una clase similar a RAII para que no pueda olvidarse de cerrar, incluso si se lanzan excepciones. –

Cuestiones relacionadas