2012-08-02 16 views
84

Estoy usando python para analizar algunos archivos grandes y estoy teniendo problemas de memoria, así que he estado usando sys.getsizeof() para intentar hacer un seguimiento del uso, pero es el comportamiento con las matrices numpy es extraño. He aquí un ejemplo que implica un mapa de albedos que estoy tener que abrir:Uso de la memoria Python de las matrices numpy

>>> import numpy as np 
>>> import struct 
>>> from sys import getsizeof 
>>> f = open('Albedo_map.assoc', 'rb') 
>>> getsizeof(f) 
144 
>>> albedo = struct.unpack('%df' % (7200*3600), f.read(7200*3600*4)) 
>>> getsizeof(albedo) 
207360056 
>>> albedo = np.array(albedo).reshape(3600,7200) 
>>> getsizeof(albedo) 
80 

Bueno, los de datos sigue ahí, pero el tamaño del objeto, un mapa de 3600x7200 píxeles, ha pasado de ~ 200 Mb a 80 bytes . Me gustaría esperar que mis problemas de memoria hayan terminado y simplemente convertir todo en matrices numpy, pero creo que este comportamiento, si es cierto, de alguna manera violaría alguna ley de la teoría de la información o la termodinámica, o algo así, así que estoy inclinado a creer que getsizeof() no funciona con matrices numpy. ¿Algunas ideas?

+4

A partir de los documentos sobre 'sys.getsizeof': "Devuelve el tamaño de un objeto en bytes. El objeto puede ser cualquier tipo de objeto. Todos los objetos incorporados devolverán los resultados correctos, pero esto no tiene que ser cierto para las extensiones de terceros, ya que es específico de la implementación. Solo el consumo de memoria directamente se atribuye al objeto, no al consumo de memoria de los objetos a los que se refiere ". –

+0

Esto hace que 'getsizeof' sea un indicador poco fiable del consumo de memoria, especialmente para extensiones de terceros. –

+7

Básicamente, el problema aquí es que 'resize' devuelve una' view', no una nueva matriz. Obtendrá el tamaño de la vista, no los datos reales. – mgilson

Respuesta

125

Puede utilizar array.nbytes para matrices numpy, por ejemplo:

>>> import numpy as np 
>>> from sys import getsizeof 
>>> a = [0] * 1024 
>>> b = np.array(a) 
>>> getsizeof(a) 
8264 
>>> b.nbytes 
8192 
+3

Sí, eso es todo. albedo.nbytes da 207360000 como se esperaba. Gracias. – EddyTheB

+0

Su sys.getsizeof (a), luego de importar sys. – eddys

0

Los siguientes trabajos sin la necesidad de crear una nueva matriz:

import numpy as np 
a = np.arange(81).reshape(9,9) 
a.size * a.dtype.itemsize 
Cuestiones relacionadas