11
votes

Comment déboguer un MemoryError à Python? Outils pour suivre une utilisation de la mémoire?

J'ai un programme Python qui meurt avec une MemoryError lorsque je l'enlève un fichier volumineux. Y a-t-il des outils que je pourrais utiliser pour déterminer ce qui utilise la mémoire?

Ce programme a fonctionné bien sur des fichiers d'entrée plus petits. Le programme nécessite évidemment des améliorations d'évolutivité; J'essaie juste de comprendre où. "Benchmark avant d'optimiser", comme une personne sage ait dit une fois.

(Juste pour prévenir la réponse inévitable "Ajouter plus RAM": Ceci est en cours d'exécution sur une boîte WinXP 32 bits avec 4 Go de RAM, donc Python a accès à 2 Go de mémoire utilisable. Ajouter plus de mémoire n'est pas techniquement possible. Réinstaller mon PC avec des fenêtres de 64 bits n'est pas pratique.)

Modifier: Oups, c'est un duplicata de quel profileur de mémoire Python est recommandé?


1 commentaires

Il en va de même pour moi ou tous ces outils ne montrent que le nombre d'objets, j'aimerais savoir où tous sont tous.


4 Réponses :


10
votes

HeyPy est un profileur de mémoire pour Python, qui est le type d'outil dont vous avez besoin.


1 commentaires

4
votes

La manière la plus simple et légère serait probablement d'utiliser le Capabilities de requête intégrées de mémoire de Python, telles que sys.getsizeof - il suffit de l'exécuter sur vos objets pour un problème réduit (c'est-à-dire un fichier plus petit) et voir quoi prend beaucoup de mémoire.


1 commentaires

Bonne et rapide solution. Certaines limitations, car vous devez savoir quel objet il est (ou avoir une supposition éduquée). En outre, cela sur une liste avec 100 objets de 100 Mo chacun retournera la taille de 100 pointes (donc seulement quelques ko) ...



2
votes

Dans votre cas, la réponse est probablement très simple: ne lisez pas le fichier entier à la fois mais traitez le bloc de fichier par le morceau. Cela peut être très facile ou compliqué en fonction de votre scénario d'utilisation. Juste par exemple, un calcul de somme de contrôle MD5 peut être effectué beaucoup plus efficacement pour d'énormes fichiers sans lire l'ensemble du fichier. Le dernier changement a considérablement réduit la consommation de mémoire dans certains scénarios d'utilisation des scons, mais il était presque impossible de suivre un profileur de mémoire.

Si vous avez toujours besoin d'un profileur de mémoire: Eliben a déjà suggéré Sys.getsizeof. Si cela ne le coupe pas, essayez le tas ou le pympleur.


0 commentaires

1
votes

Vous avez demandé une recommandation d'outil:

Python Memory Validator vous permet de surveiller l'utilisation de la mémoire, les emplacements d'allocation, les collections de GC, les instances d'objet, les instantanés de mémoire, etc. de votre application Python. Windows uniquement.

http://www.softwareverify.com/python/memory/index.html

Disclaimer: J'étais impliqué dans la création de ce logiciel.


1 commentaires

Pourquoi Windows seulement? Vous devez comprendre que c'est une minuscule minorité de développeurs de python.