2010-06-21 13 views
5

El programa que he escrito almacena una gran cantidad de datos en diccionarios. Específicamente, estoy creando 1588 instancias de una clase, cada una de las cuales contiene 15 diccionarios con 1500 asignaciones float to float. Este proceso ha estado usando los 2GB de memoria en mi computadora portátil bastante rápido (empiezo a escribir para intercambiar aproximadamente la instancia número 1000 de la clase).Uso de la memoria de Python: ¿Cuál de mis objetos está ocupando la mayor cantidad de memoria?

Mi pregunta es, ¿cuál de los siguientes está usando mi memoria?

  • 34 millones algunos pares de carrozas?
  • ¿La sobrecarga de 22,500 diccionarios?
  • la sobrecarga de 1500 clases?

Para mí, parece que la memoria debe ser la gran cantidad de números flotantes que tengo en la memoria. Sin embargo, si lo que he leído hasta ahora es correcto, cada uno de mis números flotantes ocupa 16 bytes. Como tengo 34 millones de pares, esto debería ser de 108 millones de bytes, lo que debería ser un poco más de un gigabyte.

¿Hay algo que no estoy teniendo en cuenta aquí?

Respuesta

7

Los flotadores hacen tomar hasta 16 bytes cada uno, y un diccionario con 1.500 entradas sobre 100k:

>> sys.getsizeof(1.0) 
16 
>>> d = dict.fromkeys((float(i) for i in range(1500)), 2.0) 
>>> sys.getsizeof(d) 
98444 

por lo que los 22.500 predice hacerse cargo de 2 GB por sí mismos, el otro 68 millones flotadores GB o menos. No estoy seguro de cómo calcula 68 millones de veces 16 igual a 100M - puede haber caído un cero en alguna parte.

La clase en sí misma ocupa una cantidad insignificante, y 1500 instancias de la misma (netas de los objetos a los que se refieren, como getsizeof nos da tales cantidades netas para los dicts) no mucho más que una dict pequeña, , ese no es el problema. Es decir .:

>>> sys.getsizeof(Sic) 
452 
>>> sys.getsizeof(Sic()) 
32 
>>> sys.getsizeof(Sic().__dict__) 
524 

452 para la clase, (524 + 32) * 1550 = 862K para todos los casos, como se ve que no es la preocupación cuando se tiene gigabytes cada uno en dicts y flotadores.

+0

Si conecto el rango (1000) o el rango (1250) en lugar de 1500 en el código anterior, obtengo un tamaño de 24712 bytes. Esto parece ser cierto hasta el rango (1365) en cuyo punto hay un salto discreto en el tamaño. ¿Es así como la forma en que Python asigna la memoria? Si es así, ¿por qué es este el caso? – Wilduck

+0

Pensé que se implementó un flotante de Python usando un C doble, que generalmente sería de 64 bits (8 bytes). Y el tipo doble toma 8 bytes en el módulo 'struct'. No puedo discutir con el resultado del 'getsizeof' aunque ... –

+1

@Scott, cada objeto Python tiene cierta sobrecarga (contador de referencia, puntero al tipo) además de su" carga útil ", y todas las asignaciones se redondean hacia arriba a múltiples de 16 bytes para jugar bien junto con el sistema malloc. Para mantener flotantes de manera compacta, puedes usar un 'array.array' de ellos (pero eso es similar a una lista, no a un dictado). –

Cuestiones relacionadas