Использование памяти Python: Какой из моих объектов является hogging большая часть памяти?

Программа я записал хранилищам большой объем данных в словарях. А именно, я создаю 1 588 экземпляров класса, каждый из которых содержит 15 словарей с плаванием 1500 года для плавания отображений. Этот процесс израсходовал 2 ГБ памяти на моем ноутбуке довольно быстро (я начинаю писать для свопинга приблизительно в 1000-м экземпляре класса).

Мой вопрос, какое из следующего израсходовало мою память?

  • 34 миллиона некоторые пары плаваний?
  • Издержки 22 500 словарей?
  • издержки 1 500 классов?

Мне кажется, что пожиратель ресурсов памяти должен быть огромным количеством чисел с плавающей точкой, которые я держу в памяти. Однако, Если то, что я считал до сих пор, корректно, каждое из моих чисел с плавающей точкой поднимают 16 байтов. Так как у меня есть 34 миллиона пар, это должно быть приблизительно 108 миллионов байтов, которые должны быть чуть более чем гигабайтом.

Есть ли что-то, что я не учитываю здесь?

5
задан Brian Tompsett - 汤莱恩 1 December 2015 в 23:26
поделиться

1 ответ

Плавающие действительно занимают 16 байт каждый, а dict с 1500 записями около 100 КБ:

>> sys.getsizeof(1.0)
16
>>> d = dict.fromkeys((float(i) for i in range(1500)), 2.0)
>>> sys.getsizeof(d)
98444

таким образом, 22 500 диктовок занимают более 2 ГБ сами по себе, 68 миллионов плавающих байтов занимают еще один ГБ или около того. Не уверен, как вы вычислите, что 68 миллионов умножить на 16 равно всего 100M - возможно, вы где-то уронили ноль.

Сам класс занимает ничтожно малое количество, и 1500 его экземпляров (за вычетом объектов, на которые они ссылаются, конечно, точно так же, как getsizeof дает нам такие чистые суммы для dicts) не намного больше, чем маленький диктант каждый, так что это вряд ли проблема. То есть:

>>> sys.getsizeof(Sic)
452
>>> sys.getsizeof(Sic())
32
>>> sys.getsizeof(Sic().__dict__)
524

452 для класса, (524 + 32) * 1550 = 862 КБ для всех экземпляров, как вы видите, это не проблема, когда у вас есть гигабайты в словах и с плавающей запятой.

7
ответ дан 14 December 2019 в 08:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: