2010-04-19 3 views
7

Скажем, что во время выполнения существует переменная dict, которая становится очень большой - до миллионов пар ключ: значение.Использование переменной переменной Python с большой переменной операцией

Сохраняется ли эта переменная в ОЗУ, эффективно используя всю доступную память и замедляя остальную систему?

Просить интерпретатора отображать весь дикт - это плохая идея, но было бы хорошо, если бы один ключ был доступен одновременно?

ответ

8

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

Другие сказали, что несколько миллионов предметов не должны создавать проблемы; Я не совсем уверен. Значительная нехватка памяти (до подсчета памяти, сделанной ключами и значениями). Для Python 2.6 или новее sys.getsizeof дает некоторую полезную информацию о том, сколько RAM различных структур 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 

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

Так что не нужно , что много миллионов предметов диктата, чтобы вывести ОЗУ на типичную машину.

+0

спасибо, узнал о getizeof от этого. Практически я буду иметь дело только с значениями ~ 15 тыс., А скорость - сущностью. Я использую dict просто потому, что я вообще не касался баз данных, но я предполагаю, что DB, который читает и записывает с жесткого диска, будет медленнее, чем чтение/запись в dict? – PPTim

+0

Хорошо, для такого размера у вас не должно быть никаких проблем. Каковы типы ключей и значений? Строки? –

+0

в основном плавает, некоторые строки, несколько списков – PPTim

4

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

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

+0

Как насчет bsddb? – tstenner

1

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

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

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

+0

comp, на котором я застрял, теперь имеет 512 МБ бара, и именно поэтому я заинтересован. однако большинство ключей у меня будет около 10k, поэтому я не думаю, что это должно быть проблемой. Спасибо за тест, хотя я бы не попробовал это на этом. – PPTim

+0

Большинство ОС довольно умны в управлении памятью и свопами. Вы действительно должны быть в порядке со словарем любого размера, если у вас есть место на жестком диске для файла подкачки. – ktdrv

+0

Я предполагаю, что в этом фрагменте отсутствует случайный фактор - возможно, ключ словаря? – Kylotan

5

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

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

  1. Выяснить, что структура данных, вы должны действительно использовать, потому что один ДИКТ, вероятно, не является правильным ответом. Точно, что это будет зависеть от того, что вы делаете.

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

Смежные вопросы