Ответ 1
Вы можете использовать array.nbytes
для пустых массивов, например:
>>> import numpy as np
>>> from sys import getsizeof
>>> a = [0] * 1024
>>> b = np.array(a)
>>> getsizeof(a)
8264
>>> b.nbytes
8192
Я использую 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, но я чувствую, что это поведение, если оно истинно, каким-то образом нарушит какой-либо закон теории информации или термодинамики или что-то еще, поэтому я склонный полагать, что getizeof() не работает с массивами numpy. Любые идеи?
Вы можете использовать array.nbytes
для пустых массивов, например:
>>> 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
Обратите внимание, что здесь не измеряются "неэлементные атрибуты объекта массива", поэтому фактический размер в байтах может быть на несколько байтов больше, чем этот.
В ноутбуках Python я часто хочу отфильтровать "висячие" numpy.ndarray
, в частности те, которые хранятся в _1
, _2
и т.д., Которые никогда не были предназначены для того, чтобы остаться в живых.
Я использую этот код, чтобы получить список всех из них и их размер.
Не уверен, что здесь лучше locals()
или globals()
.
import sys
import numpy
from humanize import naturalsize
for size, name in sorted(
(value.nbytes, name)
for name, value in locals().items()
if isinstance(value, numpy.ndarray)):
print("{:>30}: {:>8}".format(name, naturalsize(size)))