Я использую python для анализа некоторых больших файлов и сталкиваюсь с проблемами с памятью, поэтому я использовал sys.getsizeof (), чтобы попытаться отследить использование, но его поведение с массивными массивами странное. Вот пример с картой альбедо, которую я должен открыть:
>>> 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 байт. Я хотел бы надеяться, что мои проблемы с памятью закончились и просто конвертировать все в массивы, но я чувствую, что это поведение, если оно истинно, каким-то образом нарушит некоторый закон теории информации или термодинамики, или что-то еще, так что я склонен полагать, что getsizeof () не работает с массивами numpy. Любые идеи?
sys.getsizeof
: «Возвращать размер объекта в байтах. Объект может быть объектом любого типа. Все встроенные объекты будут возвращать правильные результаты, но это не обязательно должно быть справедливо для сторонних расширений, как есть». зависит от реализации. Учитывается только потребление памяти, непосредственно приписываемое объекту, а не потребление памяти объектами, к которым он относится ».getsizeof
ненадежным индикатором потребления памяти, особенно для сторонних расширений.resize
возвращается, аview
не новый массив. Вы получаете размер представления, а не фактические данные.sys.getsizeof(albedo.base)
даст размер не вид.Ответы:
Вы можете использовать
array.nbytes
для пустых массивов, например:источник
b.__sizeof__()
эквивалентноsys.getsizeof(b)
round(getsizeof(a) / 1024 / 1024,2)
получить MBПоле nbytes даст вам размер в байтах всех элементов массива в
numpy.array
:Обратите внимание, что это не измеряет «неэлементные атрибуты объекта массива», поэтому фактический размер в байтах может быть на несколько байтов больше, чем этот.
источник
В питоне ноутбуках я часто хочу , чтобы отфильтровать «оборванная»
numpy.ndarray
«s, в частности те, которые хранятся в_1
,_2
и т. Д., Которые никогда не были предназначены для того, чтобы остаться в живых.Я использую этот код, чтобы получить список всех их и их размер.
Не уверен , что если
locals()
илиglobals()
лучше здесь.источник