Я використовую 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 байт. Хотілося б сподіватися, що проблеми з моєю пам’яттю закінчені і просто перетворять усе на нумерові масиви, але я вважаю, що така поведінка, якщо це правда, певним чином порушить якийсь закон теорії інформації чи термодинаміку, чи щось таке, тож я схильний вважати, що getizeof () не працює з numpy масивами. Будь-які ідеї?
getsizeof
надійним показником споживання пам'яті, особливо для сторонніх розширень.
resize
це повернення a view
, а не новий масив. Ви отримуєте розмір перегляду, а не фактичні дані.
sys.getsizeof(albedo.base)
надасть розмір неперегляду.
sys.getsizeof
: "Повернути розмір об'єкта в байтах. Об'єктом може бути будь-який тип об'єкта. Усі вбудовані об'єкти повернуть правильні результати, але це не має бути правдою для сторонніх розширень, як це є конкретна реалізація. Обліковується лише споживання пам'яті, безпосередньо приписане об'єкту, а не споживання пам'яті об'єктів, на які він посилається. "