2010-09-10 2 views
4

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

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

{слово: {doc1: [места], doc2: [места], ....}}

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

+1

Несомненно, вы не хотите просто использовать Sphinx/Lucene/Xapian? –

ответ

4

shelve

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

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

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

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

+0

Спасибо всем за вашу любезную поддержку ... Я должен создать текстовую поисковую систему, которая использует инвертированный индекс.До сих пор я создал полный инвертированный индекс. Таким образом, проблема, которую я думаю, может быть, заключается в том, что по мере увеличения размера индекса, то приведение его во все это, вероятно, потребует слишком много памяти (???) .. В настоящее время я работаю только над прототипом с ограниченной функциональностью, поэтому индекс размер тривиален ... но когда он закончится, это, вероятно, будет большой файл ... вот в чем проблема. - – easysid

+0

@ Сиддхарт Шарма: «Слишком много памяти (???)». Если вы не знаете, то не начинайте, пытаясь его оптимизировать. Сначала создайте с помощью простого словаря, пока не сможете ** доказать **, что он использует слишком много памяти. Затем - и только после того, как у вас есть ** доказательство ** - переключитесь на полку. Позже вам придется переключиться на фильтр цветения. Но только после того, как вы можете ** доказать **, что полка слишком медленная. –

+0

@ S.Lott: thanx ... да, Кнут сказал: «Ранняя оптимизация - корень всего зла» ... постарается сохранить это в уме. – easysid

0

Просто хранить его в строку, как это:

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

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

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

L = s.split(delimiter) 
0

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

+0

Это будет неэффективно. Мое решение занимает меньше места. – OTZ

+0

Почему пространство имеет значение? Какая проблема на самом деле имеет первоначальный вопрос? Время? Космос? Лицензионные сборы для стороннего программного обеспечения? Нет никакого намека на то, что нужно оптимизировать. –

0

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

1

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

+0

Потому что это звучит как учебный проект. Я приехал сюда искать что-то похожее для подобных целей. – ffledgling

0

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

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