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?
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 ".getsizeof
un indicador poco confiable del consumo de memoria, especialmente para extensiones de terceros.resize
está devolviendo unview
, 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.Respuestas:
Puede usar
array.nbytes
para matrices numpy, por ejemplo:fuente
b.__sizeof__()
es equivalente asys.getsizeof(b)
round(getsizeof(a) / 1024 / 1024,2)
obtener MBEl campo nbytes le dará el tamaño en bytes de todos los elementos de la matriz en un
numpy.array
:Tenga en cuenta que esto no mide los "atributos que no son elementos del objeto de matriz", por lo que el tamaño real en bytes puede ser unos bytes mayor que este.
fuente
En los cuadernos pitón menudo me quiere filtrar 'colgando'
numpy.ndarray
's, en particular los que están almacenados en_1
,_2
etc que nunca fueron realmente para mantenerse con vida.Utilizo este código para obtener una lista de todos ellos y su tamaño.
No estoy seguro si
locals()
oglobals()
es mejor aquí.fuente