У меня есть проблема, что я ищу некоторые рекомендации для решения наиболее эффективного способа. У меня 200 миллионов строк данных размером от 3 до 70 символов. Строки состоят из букв и нескольких специальных символов, таких как тире и символы подчеркивания. Мне нужно иметь возможность быстро искать всю строку или любую подстроку в строке (минимальный размер подстроки - 3). Быстро определяется здесь менее 1 секунды.
В качестве первого разреза я сделал следующее:
-
Создано 38 индексных файлов. Индекс содержит все подстроки, начинающиеся с определенной буквы. Первый 4mb содержит 1 миллион хэш-кодов (начало хэш-цепочек). Остальная часть индекса содержит связанные цепочки списков из хэш-кодов. Мое хеширование очень равномерно распределено. 1 миллион хэш-кодов хранится в ОЗУ и зеркалируется на диск.
-
Когда строка добавляется в индекс, она разбивается на ее не дублирующиеся (внутри себя) 3-значные подстроки символов (когда n - длина строки-1). Так, например, "яблоки" хранятся в индексе "А" как pples, pple, ppl, pp (подстроки также хранятся в индексах "L" и "P" ).
Сервер поиска/добавления работает как демон (на С++) и работает как чемпион. Обычное время поиска меньше 1/2 секунды.
Проблема заключается в начале процесса. Обычно я добавляю 30 000 ключей за раз. Эта часть процесса берет навсегда. В качестве эталона время загрузки в пустой индекс 180 000 ключей переменной длины составляет приблизительно 3 1/2 часа.
Эта схема работает, за исключением очень длительного времени загрузки.
Прежде чем перейти к оптимизации ореолов (или попытке), мне интересно, есть ли лучший способ решить эту проблему. Внешний и задний подстановочные запросы (т.е. Строка типа "% ppl%" в СУБД удивительно медленна (например, в часах в MySQL) для наборов данных, таких больших. Таким образом, казалось бы, что решения СУБД не могут быть и речи. Я не могу использовать полнотекстовый поиск, потому что мы не имеем дело с нормальными словами, но строками, которые могут содержать или не состоять из реальных слов.