2010-11-11 4 views
3

J'ai un script qui charge beaucoup de données en mémoire. Je veux savoir l'efficacité des données stockées dans la mémoire. Donc, je veux être en mesure de savoir combien de mémoire a été utilisée par python avant de charger les données, et après avoir chargé les données. Aussi, je me demande, si c'est un moyen de vérifier l'utilisation de la mémoire de l'objet complexe. Disons que j'ai un dictionnaire imbriqué avec différents types de données à l'intérieur. Comment puis-je savoir combien de mémoire utilisée par toutes les données dans ce dictionnaire. Merci, AlexComment trouver la quantité totale de mémoire utilisée par le processus/objet python dans Windows

+0

Le profiler n'aide pas? – khachik

+0

lequel vous voulez dire? – Alex

Répondre

5

Autant que je sache, il n'y a pas de moyen facile de voir quelle est la consommation de mémoire d'un certain objet. Ce serait une chose non triviale à faire parce que les références pourraient être partagées entre les objets.

Voici mes deux solutions de contournement préférées:

  1. Utilisez le gestionnaire de processus. Avoir le programme pause avant l'allocation. Notez la mémoire utilisée avant l'allocation. Allouer. Notez la mémoire après l'allocation. C'est une méthode low-tech mais ça marche.
  2. Vous pouvez également utiliser pickle.dump pour sérialiser votre structure de données. Le pickle résultant sera comparable (pas identique!) En taille à l'espace nécessaire pour stocker la structure de données en mémoire. Pour de meilleurs résultats, utilisez le protocole de pickle binaire.
+0

+1, Conseils pratiques. –

2

Vous pouvez jeter un coup d'œil au paquet guppy, qui peut vous donner des informations sur la mémoire utilisée par chaque objet chargé. Malheureusement, cela ne semble pas fonctionner sous python> = 2.6, mais c'est bien si vous utilisez au plus python 2.5. Son utilisation est très simple, il suffit de mettre ces lignes dans votre code où vous souhaitez collecter des informations de mémoire:

from guppy import hpy 
hp = hpy() 
print hp.heap() 

qui vous donnera une sortie comme ceci:

Partition of a set of 25961 objects. Total size = 1894868 bytes. 
Index Count %  Size % Cumulative % Kind (class/dict of class) 
    0 11901 46 775408 41 775408 41 str 
    1 6040 23 219964 12 995372 53 tuple 
    2 1718 7 116824 6 1112196 59 types.CodeType 
    3  73 0 113608 6 1225804 65 dict of module 
    4 348 1 107232 6 1333036 70 dict (no owner) 
    5 196 1 100192 5 1433228 76 dict of type 
    6 1643 6 92008 5 1525236 80 function 
    7 209 1 90572 5 1615808 85 type 
    8 144 1 76800 4 1692608 89 dict of class 
    9 984 4 35424 2 1728032 91 __builtin__.wrapper_descriptor 
+0

ne fonctionne pas pour moi du tout – Alex

+0

erf, mon erreur, il est compatible avec au plus python2.5, pas 2.6, édité ma réponse – MatToufoutu

2

Afin d'analyser la quantité de mémoire d'un objet utilise, vous pouvez utiliser Pympler:

>>> from pympler import asizeof 
>>> obj = dict(nested=dict(trash=[1,2,3])) 
>>> asizeof.asizeof(obj) 
800 
>>> asizeof.asizeof(obj['nested']) 
480 
>>> asizeof.asizeof(obj['nested']['trash']) 
160 
>>> asizeof.asizeof(obj['nested']['trash'][0]) 
24 
0

une alternative est que vous pouvez utiliser les compteurs de performance de fenêtres par pywin32

Questions connexes