Estou usando o python para analisar alguns arquivos grandes e estou com problemas de memória, por isso tenho usado o sys.getsizeof () para tentar acompanhar o uso, mas seu comportamento com matrizes numpy é bizarro. Aqui está um exemplo envolvendo um mapa de albedos que estou tendo 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
Bem, os dados ainda estão lá, mas o tamanho do objeto, um mapa de 3600x7200 pixels, passou de ~ 200 Mb para 80 bytes. Gostaria de ter esperança de que meus problemas de memória tenham acabado e convertido tudo em matrizes numpy, mas acho que esse comportamento, se verdadeiro, de alguma forma violaria alguma lei da teoria da informação ou da termodinâmica, ou algo assim, então estou inclinado a acreditar que getsizeof () não funciona com matrizes numpy. Alguma ideia?
sys.getsizeof
: "Retorne o tamanho de um objeto em bytes. O objeto pode ser qualquer tipo de objeto. Todos os objetos internos retornarão resultados corretos, mas isso não precisa ser verdadeiro para extensões de terceiros, pois é implementação específica. Somente o consumo de memória diretamente atribuído ao objeto é contabilizado, não o consumo de memória dos objetos a que ele se refere. "getsizeof
um indicador não confiável de consumo de memória, especialmente para extensões de terceiros.resize
retorno de umaview
matriz, não de uma nova. Você está obtendo o tamanho da visualização, não os dados reais.sys.getsizeof(albedo.base)
fornecerá o tamanho da não visualização.Respostas:
Você pode usar
array.nbytes
para matrizes numpy, por exemplo:fonte
b.__sizeof__()
é equivalente asys.getsizeof(b)
round(getsizeof(a) / 1024 / 1024,2)
MBO campo nbytes fornecerá o tamanho em bytes de todos os elementos da matriz em um
numpy.array
:Observe que isso não mede "atributos que não são elementos do objeto de matriz", portanto o tamanho real em bytes pode ser alguns bytes maior que isso.
fonte
Em cadernos python muitas vezes eu quiser filtrar 'pendurada'
numpy.ndarray
's, em particular os que estão armazenados em_1
,_2
, etc que nunca foram feitos para permanecer vivo.Eu uso esse código para obter uma lista de todos eles e seu tamanho.
Não tenho certeza se
locals()
ouglobals()
é melhor aqui.fonte