Python большое переменное Использование оперативной памяти

Скажите, что существует dict переменная, которая становится очень большой во время времени выполнения - в миллионы key:value пар.

Эта переменная становится сохраненной в RAM, эффективно израсходовав всю доступную память и замедляя остальную часть системы?

Просьба, чтобы интерпретатор отобразил весь dict, является плохой идеей, но это был бы хорошо целый один ключ, получен доступ за один раз?

9
задан S.L. Barth - Reinstate Monica 11 September 2014 в 08:34
поделиться

4 ответа

Да, dict будет сохранен в памяти процесса. Поэтому, если он становится достаточно большим, чтобы в системной оперативной памяти не хватало места, вы можете ожидать значительного замедления, поскольку система начинает перекачивать память на диск и с диска.

Другие говорят, что несколько миллионов предметов не должны вызывать проблем; Я не совсем уверен. Накладные расходы dict сами по себе (до подсчета памяти, занятой ключами и значениями) значительны. Для Python 2.6 или новее sys.getsizeof дает некоторую полезную информацию о том, сколько оперативной памяти занимают различные структуры Python. Некоторые быстрые результаты из Python 2.6 на 64-битной машине OS X:

>>> from sys import getsizeof
>>> getsizeof(dict((n, 0) for n in range(5462)))/5462.
144.03368729403149
>>> getsizeof(dict((n, 0) for n in range(5461)))/5461.
36.053470060428495

Таким образом, накладные расходы dict варьируются от 36 байтов на элемент до 144 байтов на элемент на этом компьютере (точное значение зависит от того, насколько заполнена внутренняя хеш-таблица словаря; здесь 5461 = 2 ** 14 // 3 - один из пороговых значений увеличения внутренней хеш-таблицы). И это до добавления накладных расходов на сами элементы dict; если все они короткие (скажем, 6 символов или меньше), то это все равно добавляет еще> = 80 байт на элемент (возможно, меньше, если много разных ключей имеют одно и то же значение).

Таким образом, не потребуется того миллионов элементов dict, чтобы исчерпать оперативную память на типичной машине.

9
ответ дан 4 December 2019 в 10:31
поделиться

Основная проблема с миллионами элементов заключается не столько в самом словаре, сколько в том, сколько места занимает каждый из этих элементов. Тем не менее, если вы не делаете что-то странное, они, вероятно, подойдут.

Если у вас есть диктофон с миллионами ключей, вы, вероятно, делаете что-то не так. Вам следует выполнить одно или оба из следующих действий:

  1. Выясните, какую структуру данных вы должны использовать, потому что один-единственный dict, вероятно, не является правильным ответом. Что именно это будет, зависит от того, что вы делаете.

  2. Используйте базу данных. Ваш Python должен поставляться с модулем sqlite3, так что это начало.

5
ответ дан 4 December 2019 в 10:31
поделиться

Да, словарь Python хранится в ОЗУ. Однако несколько миллионов ключей не проблема для современных компьютеров. Если вам нужно все больше и больше данных, а ОЗУ заканчивается, подумайте об использовании реальной базы данных. Варианты включают реляционную БД, такую ​​как SQLite (кстати, встроенную в Python), или хранилище ключей и значений, такое как Redis.

Нет смысла отображать миллионы элементов в интерпретаторе, но доступ к одному элементу должен быть очень эффективным.

4
ответ дан 4 December 2019 в 10:31
поделиться

Насколько я знаю, Python использует лучшие алгоритмы хеширования, поэтому вы, вероятно, получите максимально возможную эффективность использования памяти и производительность. Теперь, будет ли все это храниться в ОЗУ или сохранено в файле подкачки, зависит от вашей ОС и зависит от ее объема. Я бы сказал, что лучше всего просто попробовать:

from random import randint
a = {}
for i in xrange(10*10**6):
    a[i] = i

Как это выглядит, когда вы его запускаете? Занимает около 350 МБ в моей системе, что должно быть управляемым, если не сказать больше.

2
ответ дан 4 December 2019 в 10:31
поделиться
Другие вопросы по тегам:

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