Comment allez-vous déterminer la quantité de mémoire utilisée par un objet? Je sais qu'il est possible de savoir combien est utilisé par un bloc de code, mais pas par un objet instancié (à n'importe quel moment de sa vie), ce que je veux.Découvrez la quantité de mémoire utilisée par un objet en Python
Répondre
Il n'y a pas de moyen facile de connaître la taille de la mémoire d'un objet python. Un des problèmes que vous pouvez rencontrer est que les objets Python - comme les listes et les dicts - peuvent avoir des références à d'autres objets python (dans ce cas, quelle serait votre taille? La taille contenant la taille de chaque objet?). Il existe des indicateurs de surcharge et des structures internes liées aux types d'objets et à la récupération de place. Enfin, certains objets python ont des comportements non évidents. Par exemple, les listes réservent de l'espace pour plus d'objets qu'elles n'en ont, la plupart du temps; Les dicts sont encore plus compliqués car ils peuvent fonctionner de différentes manières (ils ont une implémentation différente pour un petit nombre de clés et parfois ils ont plus d'allocations d'entrées).
Il existe un big chunk of code (et un) pour essayer d'obtenir la meilleure approximation de la taille d'un objet python en mémoire. Il y a aussi quelques simpler approximations. Mais ils seront toujours des approximations.
Vous pouvez également vérifier certains old description about PyObject (la structure C interne qui représente pratiquement tous les objets python).
@culix: On dirait que cela est maintenant utilisé dans le [Pympler] (http://pythonhosted.org/Pympler/) module. – FriendFX
Le lien "plus simple des approximations" est rompu - aviez-vous l'intention de créer un lien vers [ce message] (https://mail.python.org/pipermail/python-list/2008-January/510696.html)? – Air
Que se passe-t-il si votre objet est assez simple, comme un dictionnaire avec un mappage 'Int -> (Int, Int)'? En théorie, le calcul de la taille d'un tel objet devrait être simple, non? –
Je n'ai pas une expérience personnelle avec l'un des suivants, mais une recherche simple pour un « Python [mémoire] profileur » Rendement:
PySizer «un profileur de mémoire pour Python, » trouvé au http://pysizer.8325.org/. Cependant la page semble indiquer que le projet n'a pas été mis à jour pendant un certain temps, et se réfère à ...
Heapy, "support [ing] débogage et optimisation concernant les problèmes liés à la mémoire dans les programmes Python", trouvé à http://guppy-pe.sourceforge.net/#Heapy.
Espérons que ça aide.
Une autre approche consiste à utiliser le décapage. Voir this answer à une copie de cette question.
C'est une approche extrêmement sensible * et * simple. –
Je suis vraiment intéressé par votre réponse, mais je ne peux pas accéder au lien vers lequel pointe votre réponse ... –
@YohanObadia J'ai juste essayé le lien et cela a fonctionné ... C'est une autre réponse SO. – drevicko
Essayez ceci:
sys.getsizeof(object)
getsizeof() appelle la méthode __sizeof__
de l'objet et ajoute un collecteur d'ordures supplémentaires si les frais généraux l'objet est géré par le garbage collector.
Est-ce que cette valeur de retour de sys.getsizeof (object) inclut la taille de l'objet réel au lieu de la taille de leur pointeur comme fserb dit ci-dessus? –
Non, cela retournera la taille du pointeur. – lstyls
Ce doit être utilisé avec précaution car un remplacement sur les objets __sizeof__ pourraient induire en erreur. En utilisant bregman.suite, certains tests avec sys.getsizeof affichent une copie d'un objet tableau (données) dans une instance d'objet comme étant plus grande que l'objet lui-même (mfcc).
>>> mfcc = MelFrequencyCepstrum(filepath, params)
>>> data = mfcc.X[:]
>>> sys.getsizeof(mfcc)
64
>>> sys.getsizeof(mfcc.X)
>>>80
>>> sys.getsizeof(data)
80
>>> mfcc
<bregman.features.MelFrequencyCepstrum object at 0x104ad3e90>
Pour les grands objets que vous pouvez utiliser une méthode un peu grossière mais efficace: vérifier la quantité de mémoire de votre processus Python occupe dans le système, puis supprimez l'objet et comparer.
Cette méthode présente de nombreux inconvénients, mais elle vous donnera une estimation très rapide pour les très gros objets.
Ceci est peu susceptible d'être efficace. La mémoire libérée dans un processus n'a pas besoin d'être renvoyée au système d'exploitation, donc la recherche d'une diminution de l'utilisation de la mémoire peut ne pas être précise. –
Une approche similaire de la mesure de l'utilisation des ressources de processus python avant la création de l'objet et après serait très efficace. –
Ne pensez pas que @AntonyHatchkins en tant que gestionnaire de mémoire python n'obtient pas nécessairement de la nouvelle mémoire des systèmes d'exploitation. Dans une certaine mesure, le pool de mémoire est maintenu alloué même s'il n'est pas utilisé, donc quand il y a une nouvelle requête, elle peut être satisfaite sans avoir besoin de demander plus de mémoire au système d'exploitation. En d'autres termes, cette approche n'est pas fiable pour la création et la destruction d'objets. – spider
Similaire: http://stackoverflow.com/questions/449560/how-do-i-determine-the-size-of-an-object-in-python –
objgraph semble intéressant: http: //mg.pov .lt/objgraph/ –
Test graphique: http://stackoverflow.com/a/30008338/2087463 – tmthydvnprt