2009-02-10 5 views
30

possible en double:
Python memory profilerComment puis-je trouver des fuites de mémoire dans mon programme Python?

J'ai une ligne assez complexe (environ 20 000) programme Python qui, après un certain développement a commencé à consommer des quantités croissantes de mémoire quand il fonctionne. Quels sont les meilleurs outils et techniques pour savoir à quoi sert toute la mémoire?

Habituellement, cela revient à conserver de manière inattendue des références à des objets, ou à des bogues de module d'extension (ce qui n'est pas particulièrement probable puisque nous utilisons l'installation de Python 2.4 depuis un moment).

Nous utilisons différentes bibliothèques tierces telles que Twisted, Twisted Conch et MySQLdb.

+1

s'il vous plaît fermer - c'est un doublon –

+0

Il y avait déjà une [question] (http://stackoverflow.com/questions/110259/python-memory-profiler/110826) sur ce sujet. – Seb

Répondre

1

La mémoire de Python est gérée par un garbage collector. En général, il ne devrait pas y avoir de problème de fuite de mémoire (certainement pas pour Python 2.5 et supérieur), à moins que vous n'écriviez des modules d'extension en C/C++. Dans ce cas, Valgrind (Article de blog - http://bruynooghe.blogspot.com/2008/12/finding-memory-leaks-in-python.html) pourrait être utile. J'ai trouvé que cette personne - http://mg.pov.lt/blog/hunting-python-memleaks a utilisé PDB et matplotlib pour tracer une fuite de mémoire. J'espère que cela aide, je n'ai aucune expérience de réparation des fuites de mémoire Python.

+15

Dans un programme complexe, vous gardez parfois une référence à un objet sans le savoir. Cela rend le garbage collector incapable de récupérer la mémoire. La façon dont la question à laquelle Sebastjan est lié est meilleure; ce que je veux vraiment, c'est voir où ma mémoire est utilisée. –

+0

Merci pour le commentaire Dickon. Je garderai ça à l'esprit. – batbrat

14

Généralement, la fermeture des curseurs est l'un des types de fuites de mémoire les plus courants. Le garbage collector ne peut pas voir les ressources MySQL impliquées dans le curseur. MySQL ne sait pas que le côté Python a été publié à moins que la méthode close() ne soit explicitement appelée.

Règle de base. Ouvrez, utilisez et fermez les curseurs en une période de code aussi courte que possible.

+0

J'ai essayé de trouver pourquoi mon système ne libère pas de ressources dans un programme, et c'était exactement ça. Une si petite chose, mais quand on fait des milliers de requêtes DB, ça devient vite rapide! – Shakesbeery

+0

Des sons comme vous devriez utiliser une instruction with et une classe semblable à RAII, donc vous ne pouvez pas oublier de fermer, même si des exceptions sont levées. –

Questions connexes