Хранение инвертированного индекса

Я работаю над проектом по Info Retrieval. Я сделал полный инвертированный индекс, используя Hadoop / Python. Hadoop выводит индексы как пары (слова, документы), которые записаны в файле. Для быстрого доступа я создал словарь (хэш-таблицу), используя указанный выше файл. Мой вопрос: как я могу хранить такой индекс на диске, который также имеет быстрое время доступа. В настоящее время я храню словарь, используя python pickle module и загружаю его, но он сразу выводит весь индекс в память (или делает это?). Пожалуйста, предложите эффективный способ хранения и поиска по индексу.

Моя структура слова выглядит следующим образом (с использованием вложенных словарей)

{word: {doc1: [locations], doc2: [locations], ….}}

так что я могу получить документы, содержащие слово по словарю [word] .keys () … и так далее.

6 Solutions collect form web for “Хранение инвертированного индекса”

откладывать в долгий ящик

В настоящее время я храню словарь, используя python pickle module и загружаю его, но он сразу выводит весь индекс в память (или делает это?).

Да, это все приносит.

Это проблема? Если это не настоящая проблема, тогда придерживайтесь ее.

Если это проблема, какая у вас проблема? Слишком медленно? Слишком быстро? Слишком красочно? Слишком много памяти? Какая у вас проблема?

Я бы использовал Луцен . Зачем изобретать колесо?

Просто сохраните его в строке следующим образом:

<entry1>,<entry2>,<entry3>,...,<entryN> 

Если символ <entry*> содержит символ ',', используйте другой разделитель, например '\ t'. Это меньше по размеру, чем эквивалентная маринованная строка.

Если вы хотите загрузить его, просто выполните:

 L = s.split(delimiter) 

Вы можете сохранить словарь () словаря и использовать его для его воссоздания.

Если для загрузки или использования слишком большого объема памяти требуется много времени, вам может понадобиться база данных. Их можно использовать много; Я бы, наверное, начал с SQLite . Тогда ваша проблема «снижена» ;-), чтобы просто сформулировать правильный запрос, чтобы получить то, что вам нужно из базы данных. Таким образом, вы загружаете только то, что вам нужно.

Для этой цели я использую anydmb. Anydbm предоставляет тот же словарь-подобный интерфейс, за исключением того, что он позволяет использовать только строки как ключи и значения. Но это не является ограничением, так как вы можете использовать нагрузки / дампы cPickle для хранения более сложных структур в индексе.

Python - лучший язык программирования в мире.