2009-04-14 14 views
12

¿Cuál es una buena forma de estimar la huella de memoria de un objeto?Python: ¿Cómo estimar/calcular la huella de memoria de las estructuras de datos?

Por el contrario, ¿cuál es una buena forma de medir la huella?

Por ejemplo, decir que tengo un diccionario cuyos valores son listas de número entero, flotar tuplas:

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

tengo 4G de memoria física y me gustaría averiguar aproximadamente cuántas filas (clave: valores) Puedo almacenar en memoria antes de derramar en intercambio. Esto está en linux/ubuntu 8.04 y OS X 10.5.6.

Además, ¿cuál es la mejor manera de averiguar la huella en la memoria real de mi programa? ¿Cómo puedo averiguar cuándo es agotador la memoria física y el derrame?

Respuesta

9

Guppy tiene un perfilador bonito recuerdo (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 es un poco poco documentadas, por lo que podría tener que excavar a través de la página web o el código fuente un poco, pero es muy potente. También hay algunos articles que pueden ser relevantes.

+1

¿Por qué hay 6 objetos 'str' en 'd'? –

+0

Al enlazar una nueva variable, se crea una nueva cadena ('d'). Las cuentas de búsqueda de atributos (heap) representan otra. No sé de dónde viene el resto. –

+0

Los resultados reales varían y debe verificarlos contra la implementación del intérprete particular que está utilizando o realizar un ensayo y error para encontrar la varianza. Por ejemplo, acabo de probar el ejemplo anterior e informó tres cadenas que totalizan 96 bytes. –

5

Usted puede hacer esto con un perfilador de memoria, de los cuales hay un par Soy consciente de:

  1. PySizer - poissibly obsoleta, ya que la página de inicio ahora recomienda:

  2. Heapy.

Esto es posiblemente una pregunta duplicada de this.

Cuestiones relacionadas