Программа я записал хранилищам большой объем данных в словарях. А именно, я создаю 1 588 экземпляров класса, каждый из которых содержит 15 словарей с плаванием 1500 года для плавания отображений. Этот процесс израсходовал 2 ГБ памяти на моем ноутбуке довольно быстро (я начинаю писать для свопинга приблизительно в 1000-м экземпляре класса).
Мой вопрос, какое из следующего израсходовало мою память?
Мне кажется, что пожиратель ресурсов памяти должен быть огромным количеством чисел с плавающей точкой, которые я держу в памяти. Однако, Если то, что я считал до сих пор, корректно, каждое из моих чисел с плавающей точкой поднимают 16 байтов. Так как у меня есть 34 миллиона пар, это должно быть приблизительно 108 миллионов байтов, которые должны быть чуть более чем гигабайтом.
Есть ли что-то, что я не учитываю здесь?
Плавающие действительно занимают 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 КБ для всех экземпляров, как вы видите, это не проблема, когда у вас есть гигабайты в словах и с плавающей запятой.