2013-11-16 2 views
8

У меня есть большая коллекция данных, около 10 миллионов словарных статей и часть моей программы, необходимой очень много членских проверок ...Словарь, набор или frozenset?

if a in data: 
    return True 
return False 

прямо сейчас у меня есть данные, как словарные со всеми их значениями, равных «1 '

у меня также есть программа, которая использует алгоритм, чтобы выяснить ту же информацию, но теперь медленнее, чем метод словаря, однако я ожидаю, что размер данных будет продолжать расти ...

для моего текущее решение словаря, набирает (данные) как фризонсет или устанавливает (или что-то еще ?) быстрее?

И для будущего, чтобы узнать, когда мне нужно переключиться на мою программу, кто-нибудь знает, как скорость проверки членства коррелирует с увеличением размера хэшируемого типа? Является ли словарь с 1 миллиардом записей еще быстрым?

+4

'словарь с 1 миллиардом записей по-прежнему быстрый?' Конечно не –

+4

Просто на стороне примечание: ваши три строки кода эквивалентны «возвращать a в данных». – Hyperboreus

ответ

6

На Principal

Если вы ожидаете данные, чтобы продолжать расти, вы не можете использовать frozenset.

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

Практически ...

Когда вы имеете дело с тем, что многие записи перенести данные в базу данных . В конечном итоге у вас не хватит памяти, пытаясь сохранить и прочитать все это в памяти. С помощью базы данных вы можете указать конкретный запрос для проверки членства. Шутки в сторону. Поместите эти данные в базу данных.

+4

+1 для упоминания использования баз данных в таких случаях, где это могло бы вызвать «MemoryError» –

+1

Как установить быстрее, чем dict? – BrenBarn

+0

@BrenBarn, вы правы, думая об этом сейчас, это не так. Ответ отредактирован. – RyPeck

1

На входе в хеш-память может быть несколько байтов (независимо от того, какой словарь или набор не имеет большого значения), так что за миллиарды записей вы столкнетесь с заменой, если у вас нет 32 + Gb памяти для приложение. Я хотел бы начать искать для быстрого DB

Для frozenset вы также должны иметь все данные в памяти в какой-то приемлемой форме во время создания, которые, вероятно, удваивает количество мем необходимо

1

Для этого объема данных RyPeck является право - БД будет делать работу намного лучше.

Еще один момент: что-то кажется странным для меня в том, что вы написали: Если вы используете словарь, чтобы хранить объекты в членстве, что сказала стоимость ключа-значение пара в словаре «1 «? Не следует использовать пару слова «ключ-значение» словаря: «id of a» - «a», где «a» - это объект.

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