Скажите, что существует dict переменная, которая становится очень большой во время времени выполнения - в миллионы key:value пар.
Эта переменная становится сохраненной в RAM, эффективно израсходовав всю доступную память и замедляя остальную часть системы?
Просьба, чтобы интерпретатор отобразил весь dict, является плохой идеей, но это был бы хорошо целый один ключ, получен доступ за один раз?
Да, 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, чтобы исчерпать оперативную память на типичной машине.
Основная проблема с миллионами элементов заключается не столько в самом словаре, сколько в том, сколько места занимает каждый из этих элементов. Тем не менее, если вы не делаете что-то странное, они, вероятно, подойдут.
Если у вас есть диктофон с миллионами ключей, вы, вероятно, делаете что-то не так. Вам следует выполнить одно или оба из следующих действий:
Выясните, какую структуру данных вы должны использовать, потому что один-единственный dict, вероятно, не является правильным ответом. Что именно это будет, зависит от того, что вы делаете.
Используйте базу данных. Ваш Python должен поставляться с модулем sqlite3, так что это начало.
Да, словарь Python
хранится в ОЗУ. Однако несколько миллионов ключей не проблема для современных компьютеров. Если вам нужно все больше и больше данных, а ОЗУ заканчивается, подумайте об использовании реальной базы данных. Варианты включают реляционную БД, такую как SQLite (кстати, встроенную в Python), или хранилище ключей и значений, такое как Redis.
Нет смысла отображать миллионы элементов в интерпретаторе, но доступ к одному элементу должен быть очень эффективным.
Насколько я знаю, Python использует лучшие алгоритмы хеширования, поэтому вы, вероятно, получите максимально возможную эффективность использования памяти и производительность. Теперь, будет ли все это храниться в ОЗУ или сохранено в файле подкачки, зависит от вашей ОС и зависит от ее объема. Я бы сказал, что лучше всего просто попробовать:
from random import randint
a = {}
for i in xrange(10*10**6):
a[i] = i
Как это выглядит, когда вы его запускаете? Занимает около 350 МБ в моей системе, что должно быть управляемым, если не сказать больше.