Использование памяти Python массивов numpy


Я использую python для анализа некоторых больших файлов, и у меня возникают проблемы с памятью, поэтому я использую sys.getsizeof (), чтобы попытаться отслеживать использование, но это поведение с массивами 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

ну данные все еще там, но размер объекта, 3600x7200 пикселей карты, пошел от ~200 Мб до 80 байт. Я хотел бы надеяться, что мои проблемы с памятью и просто конвертировать все для массивов numpy, но я чувствую, что это поведение, если оно верно, каким-то образом нарушит какой-то закон теории информации или термодинамики или что-то еще, поэтому я склонен полагать, что getsizeof() не работает с массивами numpy. Есть идеи?

2 101

2 ответа:

можно использовать array.nbytes для массивов numpy, например:

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

поле nbytes даст вам размер в байтах всех элементов массива в numpy.array:

size_in_bytes = my_numpy_array.nbytes

обратите внимание, что это не меры "не-элемент атрибутами объекта Array", поэтому фактический размер в байтах может быть несколько байт больше, чем это.