Я использую 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. Любые идеи?
getsizeof
ненадежным индикатором потребления памяти, особенно для сторонних расширений.
resize
возвращается, а view
не новый массив. Вы получаете размер представления, а не фактические данные.
sys.getsizeof(albedo.base)
даст размер не вид.
sys.getsizeof
: «Возвращать размер объекта в байтах. Объект может быть объектом любого типа. Все встроенные объекты будут возвращать правильные результаты, но это не обязательно должно быть справедливо для сторонних расширений, как есть». зависит от реализации. Учитывается только потребление памяти, непосредственно приписываемое объекту, а не потребление памяти объектами, к которым он относится ».