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

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

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

{слово: {документ1: [местоположения], документ2: [местоположения], ....}}

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


person easysid    schedule 10.09.2010    source источник
comment
Уверены, что вы не хотите просто использовать Sphinx / Lucene / Xapian?   -  person Jochen Ritzel    schedule 10.09.2010


Ответы (6)


полка

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

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

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

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

person S.Lott    schedule 10.09.2010
comment
Спасибо всем за вашу любезную поддержку ... Я должен создать систему текстового поиска, которая использует инвертированный индекс. Пока что я построил полный инвертированный индекс. Итак, проблема, которая, как я думаю, у меня может возникнуть, заключается в том, что по мере роста размера индекса внесение всего этого, вероятно, потребует слишком много памяти (???). В настоящее время я работаю только над прототипом с ограниченной функциональностью, поэтому индекс размер тривиален ... но когда он будет закончен, это, вероятно, будет большой файл ... это проблема, которая у меня есть. - - person easysid; 13.09.2010
comment
@Siddharth Sharma: потребляет слишком много памяти (???). Если вы не знаете, не начинайте с попытки его оптимизировать. Во-первых, используйте простой словарь, пока вы не докажете, что он использует слишком много памяти. Затем - и только после того, как у вас будет доказательство - переключитесь на полку. Позже вам придется переключиться на фильтр Блума. Но только после того, как вы докажете, что полка работает слишком медленно. - person S.Lott; 13.09.2010
comment
@ S.Lott: спасибо ... да, Кнут сказал, Ранняя оптимизация - корень всех зол .... постараюсь помнить об этом. - person easysid; 14.09.2010
comment
@Siddharth Sharma: Помните о своих целях. (1) Работает. (2) Оптимальное использование ресурсов. Вы не можете сделать № 2, пока не сделаете № 1. - person S.Lott; 14.09.2010

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

person Jay Askren    schedule 14.09.2010
comment
Потому что это звучит как академический учебный проект. Я пришел сюда в поисках чего-то похожего для аналогичных целей. - person ffledgling; 15.01.2014

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

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

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

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

L = s.split(delimiter)
person OTZ    schedule 10.09.2010

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

person supakeen    schedule 10.09.2010
comment
Это будет занимать мало места. Мое решение занимает меньше места. - person OTZ; 11.09.2010
comment
Почему пространство имеет значение? Какая проблема на самом деле есть в исходном вопросе? Время? Космос? Лицензионные сборы для стороннего программного обеспечения? Нет намека на то, что оптимизировать. - person S.Lott; 11.09.2010

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

person kindall    schedule 10.09.2010

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

person msaveski    schedule 17.03.2011