Использование памяти Python: Какой из моих объектов занимает больше всего памяти? - PullRequest
5 голосов
/ 21 июня 2010

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

Мой вопрос: что из нижеперечисленного расходует мою память?

  • 34 миллиона, несколько пар поплавков?
  • Накладные расходы на 22 500 словарей?
  • накладные расходы 1500 классов?

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

Есть что-то, что я здесь не принимаю во внимание?

1 Ответ

7 голосов
/ 21 июня 2010

Число с плавающей запятой занимает по 16 байт в каждом, а диктат с 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 дает нам такие чистые суммы для диктов), не намного больше, чем каждый маленький диктат, так что это вряд ли проблема.Т.е.:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...