2011-05-24 27 views
8

Mi programa python tiene un comportamiento de rendimiento curioso: cuanto más tiempo se ejecuta, más lento se vuelve. Al principio, genera decenas de unidades de trabajo por minuto. Después de una hora de duración, toma decenas de minutos por unidad de trabajo. Mi sospecha es que esto es causado por un recolector de basura congestionado.¿Cuánto tiempo está usando el recolector de basura?

El problema es que mi script tiene demasiada memoria para que cProfile funcione en grandes tiradas. (ver: cProfile taking a lot of memory)

Hemos escrito nuestro propio plugin de rendimiento y podemos observar la mayoría de las partes de nuestro sistema y ninguno de ellos parece ser el problema. La única roca que aún no se ha movido es el GC.

¿Hay alguna otra manera (además de profile o cProfile) para ver cuánto tiempo va al GC?

Respuesta

6

En Python, la mayoría de la basura se recoge utilizando el recuento de referencias. Uno esperaría que esto sea rápido e indoloro, y parece poco probable que esto sea lo que está buscando. Supongo que está preguntando sobre el recopilador al que hace referencia el módulo gc, que solo se utiliza para referencias circulares.

Hay algunas cosas que podrían ser de utilidad: http://docs.python.org/library/gc.html

Aunque no parece ser un método directo para tiempo el recolector de basura, puede encenderlo y fuera, habilitar la depuración, mira el recuento de colecciones, etc. Todo esto podría ser útil en tu búsqueda.

Por ejemplo, en mi sistema gc imprime el tiempo transcurrido Si enciende los indicadores de depuración:

In [1]: import gc 

In [2]: gc.set_debug(gc.DEBUG_STATS) 

In [3]: gc.collect() 
gc: collecting generation 2... 
gc: objects in each generation: 159 2655 7538 
gc: done, 10 unreachable, 0 uncollectable, 0.0020s elapsed. 

Todo esto a un lado, lo primero que me gustaría ver es la evolución del uso de la memoria de su programa mientras se ejecuta. Una posibilidad es que simplemente está llegando al límite de RAM física disponible y se está desacelerando debido a excesivas fallas de página, en lugar de tener que ver con el recolector de elementos no utilizados.

+0

Sí, soy consciente de eso. Esos pueden decirme con cuánto se ocupa el GC, pero mis problemas inmediatos son con los ciclos del procesador, no con la memoria. Si pudiera decirme el * tiempo * que el GC ha usado o incluso * la frecuencia * que se ha ejecutado, podría ser útil. –

+0

@Matthew: ¿le ayudaría a su proceso llamar a 'gc.collect()' en sí mismo, y el tiempo que tarda en regresar? –

+0

@Thomas K, eso me diría cuánto tiempo estuvo tomando una sola colección, pero no con qué frecuencia se está ejecutando el recopilador. Debido a otros datos que tengo, sospecho que el GC se está ejecutando cada vez más a menudo (con cada vez menos efecto) a medida que el sistema se ejecuta. –

Cuestiones relacionadas