203 votes

Fuites de mémoire en Python

J'ai un script qui s'exécute longtemps et qui, si on le laisse tourner assez longtemps, va consommer toute la mémoire de mon système.

Sans entrer dans les détails du script, j'ai deux questions :

  1. Y a-t-il des "meilleures pratiques" à suivre pour éviter les fuites ?
  2. Quelles sont les techniques permettant de déboguer les fuites de mémoire en Python ?

5 votes

J'ai trouvé cette recette utile.

0 votes

Il semble imprimer beaucoup trop de données pour être utile.

1 votes

@Casebash : Si cette fonction imprime quelque chose, vous vous y prenez mal. Elle liste les objets avec __del__ qui ne sont plus référencés, sauf pour leur cycle. Le cycle ne peut pas être rompu, en raison de problèmes liés à la méthode __del__ . Réparez-la !

110voto

ChristopheD Points 38217

Jetez un coup d'œil à cet article : Tracer les fuites de mémoire en python

Notez également que le module de collecte des déchets peuvent effectivement avoir des drapeaux de débogage définis. Regardez le set_debug fonction. En outre, regardez ce code par Gnibbler pour déterminer les types d'objets qui ont été créés après un appel.

31voto

Denis Ryzhkov Points 331

Permettez-moi de vous recommander mem_top outil que j'ai créé

Cela m'a aidé à résoudre un problème similaire

Il montre instantanément les principaux suspects de fuites de mémoire dans un programme Python.

2 votes

C'est vrai... mais il donne très peu d'explications sur l'utilisation et les résultats.

0 votes

@me_ , cet outil a les deux sections "Utilisation" et "Explication du résultat" documentées. Devrais-je ajouter une explication comme "refs est le nombre de références de l'objet, types est le nombre d'objets de ce type, bytes est la taille de l'objet" - ne serait-il pas trop évident de documenter cela ?

0 votes

La documentation d'utilisation de l'outil ne donne qu'une seule ligne disant "de temps en temps : logging.debug(mem_top())", tandis que l'explication des résultats est l'expérience réelle de l'auteur en matière de suivi d'erreurs sans contexte... ce n'est pas une spécification technique qui dit à un développeur exactement ce qu'il regarde... Je ne critique pas votre réponse... elle montre des suspects de haut niveau comme facturé... elle ne donne pas une documentation adéquate pour comprendre pleinement le résultat de l'utilisation... par exemple, dans la sortie "Explaining Results" pourquoi le "GearmanJobRequest" est manifestement un problème ? aucune explication pour pourquoi...

13voto

Juergen Points 4839

Vous devriez surtout jeter un coup d'œil à vos données globales ou statiques (données à long terme).

Lorsque ces données se développent sans restriction, vous pouvez également obtenir des problèmes en Python.

Le ramasseur de déchets ne peut collecter que les données qui ne sont plus référencées. Mais vos données statiques peuvent accrocher des éléments de données qui doivent être libérés.

Les cycles de mémoire peuvent constituer un autre problème, mais en théorie, le collecteur d'ordures devrait trouver et éliminer les cycles - du moins tant qu'ils ne sont pas accrochés à des données de longue durée.

Quels types de données sur la longévité sont particulièrement problématiques ? Regardez bien les listes et les dictionnaires : ils peuvent croître sans aucune limite. Dans les dictionnaires, il se peut même que vous ne voyiez pas venir le problème, car lorsque vous accédez aux dictionnaires, le nombre de clés dans le dictionnaire peut ne pas être très visible pour vous...

3voto

martiert Points 880

Je ne suis pas sûr des "meilleures pratiques" pour les fuites de mémoire en python, mais python devrait vider sa propre mémoire par son garbage collector. Je commencerais donc par vérifier la présence d'une liste circulaire courte, puisqu'elle ne sera pas récupérée par le ramasseur d'ordures.

3 votes

Ou des références à des objets qui sont conservés pour toujours, etc.

6 votes

Pouvez-vous fournir des exemples de listes circulaires et d'objets qui sont conservés pour toujours ?

2voto

David S. Points 57

J'ai trouvé cette recette utile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X