2011-05-24 6 views
8

Mon programme python a un comportement de performance curieux: plus il s'exécute, plus il est lent. Au début, il lance des dizaines d'unités de travail par minute. Après une heure, cela prend des dizaines de minutes par unité de travail. Mon soupçon est que cela est causé par un garbage collector encombré.Combien de temps l'éboueur utilise-t-il?

Le hic est que mon script est trop gourmand en mémoire pour cprofile de travailler sur de grandes courses. (voir: cProfile taking a lot of memory)

Nous avons écrit notre propre plugin de performance et nous pouvons observer la plupart des parties de notre système et aucun d'entre eux ne semble être le problème. Le seul roc qui n'a pas encore été retourné est le GC.

Y at-il une autre façon (en plus de profil ou cprofile) pour voir combien de temps va le GC?

Répondre

6

En Python, la plupart des déchets sont collectés en utilisant le comptage de référence. On s'attendrait à ce que cela soit rapide et indolore, et il semble peu probable que ce soit ce que vous recherchez. Je suppose que vous posez des questions sur le collecteur référencé par le module gc, qui n'est utilisé que pour les références circulaires.

Il y a quelques choses qui pourraient être utiles: http://docs.python.org/library/gc.html

Bien qu'il ne semble pas être une méthode directe pour temps le garbage collector, vous pouvez activer et désactiver, activer le débogage, Regardez le décompte des collections, etc. Tout cela pourrait être utile dans votre quête.

Par exemple, sur mon système gc imprime le temps écoulé si vous activez les indicateurs de débogage:

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. 

Tout cela mis à part, la première chose que je regarde est l'évolution de l'utilisation de la mémoire de votre programme tel qu'il fonctionne. Une possibilité est qu'il atteint simplement la limite de la RAM physique disponible et ralentit en raison d'erreurs de page excessives, plutôt que de quelque chose à faire avec le garbage collector.

+0

Oui, je suis au courant. Ceux-ci peuvent me dire combien de choses le GC traite, mais mes problèmes immédiats sont avec des cycles de processeur, pas de mémoire. Si cela pouvait me dire le * temps * que le GC a utilisé ou même * combien de fois * il a passé, cela pourrait être utile. –

+0

@Matthew: cela aiderait-il votre processus à appeler 'gc.collect()' lui-même, et le temps qu'il faut pour revenir? –

+0

@Thomas K, cela me dirait combien de temps une seule collection prenait, mais pas à quelle fréquence le collectionneur fonctionne. Étant donné les autres données que j'ai, je soupçonne que le GC fonctionne de plus en plus souvent (de moins en moins d'effet) pendant que le système fonctionne. –

Questions connexes