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í?
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
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 ... –
@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). –