Как я могу выполнить поиск в таблице поиска, не загружая ее в память?

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

P.S. Я просто хочу выполнить поиск, не загружая все записи в память.

Может ли база данных "ключ-значение" решить эту проблему?


person 杨应彬    schedule 04.06.2015    source источник
comment
Посмотрите на sqlite...   -  person marom    schedule 04.06.2015
comment
В зависимости от структуры данных вы можете разработать функцию поиска на диске. Для общего поиска вы хотите использовать базу данных, чтобы сделать эту работу за вас.   -  person Tim3880    schedule 04.06.2015


Ответы (2)


В конце концов вам придется загружать данные с жесткого диска, но если таблица большая, она не поместится в память, чтобы выполнить линейный поиск по ней, поэтому:

  1. подумайте, можете ли вы разделить данные на набор файлов
  2. сделать индексную таблицу того, какой файл содержит какие записи (скажем, первые 100 записей находятся в «file1_100», вторая сотня находится в «file101_201» и т. д.)
  3. используя индексную таблицу из шага 2, найдите файл для загрузки
  4. загрузите файл и выполните линейный поиск

Это очень упрощенная схема для типичной системы управления базами данных, поэтому вы можете использовать такую, как MySQL, PostgreSQL, MsSQL, Oracle или любую из них. Если это учебный проект, то после того, как вы решите проблему поиска, подумайте об оптимизации линейных операций (путем переключения на что-то вроде бинарного поиска) и таблиц (в реальных базах данных используются сбалансированные древовидные структуры, хэш-таблицы и т.п.).

person 047    schedule 04.06.2015
comment
Спасибо за ваш подробный совет. - person 杨应彬; 05.06.2015

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

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

В этом примере вы сначала прочитаете в соответствующей группе на основе письма. Таким образом, если слово, которое вы ищете, начинается с «m», вы загрузите группу «m» в память.

Существуют и другие методы группировки, такие как длина слова (ключа). Также могут быть подгруппы. В этом примере вы можете разделить группу «m» на длину слова или на вторую букву.

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

Есть много способов сохранить группы в файле, например, с помощью маркера «раздел». Хотя это уже другой вопрос.

Идеи здесь, в том числе из @047, состоят в том, чтобы структурировать данные для наиболее эффективного поиска, учитывая ваши ограничения памяти.

person Thomas Matthews    schedule 04.06.2015
comment
Спасибо. Я думаю, что основная идея вашего предложения состоит в том, чтобы проиндексировать файл, и я собираюсь использовать Lemur Indri, чтобы сделать это за меня. - person 杨应彬; 05.06.2015