2009-04-14 10 views
12

Quel est un bon moyen d'estimer l'empreinte mémoire d'un objet? Inversement, quelle est une bonne façon de mesurer l'empreinte?Python: Comment estimer/calculer l'empreinte mémoire des structures de données?

Par exemple, dire que j'ai un dictionnaire dont les valeurs sont des listes d'entier, float tuples:

d['key'] = [ (1131, 3.11e18), (9813, 2.48e19), (4991, 9.11e18) ] 

J'ai 4G de mémoire physique et je voudrais savoir à peu près combien de lignes (clés: valeurs) Je peux stocker dans la mémoire avant que je déborde dans l'échange. C'est sur Linux/Ubuntu 8.04 et OS X 10.5.6.

En outre, quelle est la meilleure façon de comprendre l'empreinte réelle en mémoire de mon programme? Comment puis-je mieux comprendre quand il y a épuisement de la mémoire physique et débordement?

Répondre

9

Guppy a un profileur de mémoire agréable (Heapy):

>>> from guppy import hpy 
>>> hp = hpy() 
>>> hp.setrelheap() # ignore all existing objects 
>>> d = {} 
>>> d['key'] = [ (1131, 3.11e18), (9813, 2.48e19), (4991, 9.11e18) ] 
>>> hp.heap() 
Partition of a set of 24 objects. Total size = 1464 bytes. 
Index Count %  Size % Cumulative % Kind (class/dict of class) 
    0  2 8  676 46  676 46 types.FrameType 
    1  6 25  220 15  896 61 str 
    2  6 25  184 13  1080 74 tuple 
... 

Heapy est un peu underdocumented, de sorte que vous pourriez avoir à creuser à travers la page web ou code source un peu, mais il est très puissant. Il y a aussi quelques articles qui pourraient être pertinents.

+1

Pourquoi y a-t-il 6 objets 'str' dans 'd'? –

+0

Lors de la liaison d'une nouvelle variable, une nouvelle chaîne est créée ('d'). La recherche d'attribut (tas) compte pour un autre. Je ne sais pas d'où vient le reste. –

+0

Les résultats réels varient et vous devez soit les vérifier par rapport à la mise en œuvre d'interpréteur particulière que vous utilisez, soit faire quelques essais et erreurs pour trouver la variance. Par exemple, j'ai juste essayé l'exemple ci-dessus et il a rapporté trois chaînes totalisant 96 octets. –

5

Vous pouvez le faire avec un profileur de mémoire, dont il y a deux ou trois, je suis au courant:

  1. PySizer - poissibly obsolète, comme la page d'accueil recommande maintenant:

  2. Heapy.

Il s'agit probablement d'un doublon de la question this.

Questions connexes