Estoy usando Python para analizar algunos archivos grandes y me encuentro con problemas de memoria, así que he estado usando sys.getsizeof () para tratar de hacer un seguimiento del uso, pero su comportamiento con matrices numpy es extraño. Aquí hay un ejemplo que involucra un mapa de albedos que tengo que abrir:
>>> 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 datos todavía están allí, 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 siento que este comportamiento, si es cierto, violaría de alguna manera alguna ley de la teoría de la información o la termodinámica, o algo así, así que estoy inclinados a creer que getsizeof () no funciona con matrices numpy. ¿Algunas ideas?
getsizeof
un indicador poco confiable del consumo de memoria, especialmente para extensiones de terceros.
resize
está devolviendo un view
, no una nueva matriz. Obtiene el tamaño de la vista, no los datos reales.
sys.getsizeof(albedo.base)
dará el tamaño de la no vista.
sys.getsizeof
: "Devuelve el tamaño de un objeto en bytes. El objeto puede ser cualquier tipo de objeto. Todos los objetos integrados devolverán resultados correctos, pero esto no tiene que ser cierto para las extensiones de terceros, ya que es implementación específica. Solo se tiene en cuenta el consumo de memoria directamente atribuido al objeto, no el consumo de memoria de los objetos a los que se refiere ".