Хранение инвертированного индекса - PullRequest
4 голосов
/ 10 сентября 2010

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

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

{word: {doc1: [местоположения], doc2: [местоположения], ....}}

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

Ответы [ 6 ]

4 голосов
/ 10 сентября 2010

сукно

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

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

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

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

1 голос
/ 14 сентября 2010

Я бы использовал Lucene .Зачем изобретать велосипед?

0 голосов
/ 17 марта 2011

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

0 голосов
/ 11 сентября 2010

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

0 голосов
/ 11 сентября 2010

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

0 голосов
/ 11 сентября 2010

Просто сохраните его в такой строке:

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

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

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

L = s.split(delimiter)
...