Tengo un pequeño script multiproceso ejecutando en django y con el tiempo comienza a usar más y más memoria. Dejándolo por un día completo come alrededor de 6GB de RAM y empiezo a intercambiar.Python: depuración de fugas de memoria
Siguiendo http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks Veo esto como los tipos más comunes (con sólo 800M de memoria utilizada):
(Pdb) objgraph.show_most_common_types(limit=20)
dict 43065
tuple 28274
function 7335
list 6157
NavigableString 3479
instance 2454
cell 1256
weakref 974
wrapper_descriptor 836
builtin_function_or_method 766
type 742
getset_descriptor 562
module 423
method_descriptor 373
classobj 256
instancemethod 255
member_descriptor 218
property 185
Comment 183
__proxy__ 155
que no muestra nada raro. ¿Qué debo hacer ahora para ayudar a depurar los problemas de memoria?
Actualización: Probando algunas cosas que la gente está recomendando. Ejecuté el programa de la noche a la mañana y, cuando lo hago, utilizo un 50% * 8G == 4G de RAM.
(Pdb) from pympler import muppy
(Pdb) muppy.print_summary()
types | # objects | total size
========================================== | =========== | ============
unicode | 210997 | 97.64 MB
list | 1547 | 88.29 MB
dict | 41630 | 13.21 MB
set | 50 | 8.02 MB
str | 109360 | 7.11 MB
tuple | 27898 | 2.29 MB
code | 6907 | 1.16 MB
type | 760 | 653.12 KB
weakref | 1014 | 87.14 KB
int | 3552 | 83.25 KB
function (__wrapper__) | 702 | 82.27 KB
wrapper_descriptor | 998 | 77.97 KB
cell | 1357 | 74.21 KB
<class 'pympler.asizeof.asizeof._Claskey | 1113 | 69.56 KB
function (__init__) | 574 | 67.27 KB
Eso no se suma a 4G, ni tampoco me da ningún big data estructurado para solucionarlo. El Unicode es de un conjunto() de nodos "hechos", y la lista parece simplemente aleatoria weakref
s.
No utilicé guppy ya que requería una extensión C y no tenía root, así que me iba a costar construir.
Ninguno de los objetos que estaba usando tiene un método __del__
, y mirando a través de las bibliotecas, no parece que ni django ni python-mysqldb lo hagan. ¿Alguna otra idea?
"running in Django"? ¿Quiere decir que está utilizando el servidor web de Django para hacer un procesamiento de fondo adicional que no sea del servicio web? ¿Has considerado dividir este material que no es web en un proceso separado? –
Es un trabajo de cron que importa Django settgings.py y usa muchas de las funciones de ORM de Django. Por lo tanto, no es generado por un servidor web, pero aún usa muchas de las características (que podrían haber sido pertinentes) –