Слайд 2Задача
Поиск слов и фраз в большой текстовой коллекции
Слайд 3Инвертированные файлы
Часто используются для поиска
Сложно добавлять новые данные
Слайд 4Инвертированные файлы
Для каждой словоформы сохраняется информация о том, в каких документах и
где в документах она встречается
Слайд 5Пример информации о вхождении
1) Номер (ID) файла
2) Позиция словоформы в файле (порядковый
номер словоформы, номер предложения, и т. д. )
Слайд 6Задача
Нужно сделать индекс, который бы позволял легко добавлять в него новые данные
Слайд 7CLB-дерево
B-дерево, в нем хранятся слова
Информация о вхождениях слова сохраняется в списке блоков
Слайд 8Морфология
Морфологический анализатор
Для каждой словоформы из словаря выдается набор базовых форм.
Базовых форм ~
200 тысяч.
Словоформ ~ 4 млн.
Слайд 9Кэширование
Храним в B-дереве не словоформы, а базовые формы. Можем хранить в памяти
последний блок для каждой базовой формы.
Слайд 10Плюсы
Можно быстро добавлять новые данные. Информация о новых вхождениях слова добавляется в
последний блок списка. Когда он заполняется - создается новый блок.
Слайд 11Минусы
1) Фрагментация – блоки могут располагаться в разных местах
2) Неэффективное использование дисковой
памяти, блоки могут быть слабо заполнены
3) Требует много памяти для использования большого размера блока (200 000 x <Размер блока>).
Слайд 12Проблема фрагментации
Пусть в списке блоков k блоков.
Выберем число m = 2C
Разделим весь
список блоков на группы, размером m блоков в каждой, за исключением последней.
Слайд 13Пример
У нас есть 25 блоков и m = 8.
Разбиваем 25 блоков
на группы следующих размеров 8, 8, 8, 1.
Слайд 14Проблема фрагментации
Информация о вхождениях слова сохраняется в списке блоков
Слайд 15Алгоритм
Пусть есть k заполненных подряд расположенных блоков B1, …, Bk, в частности
последний блок также заполнен, и нам требуется взять где-то новый блок.
Слайд 16k = 2x, x < c
ищем 2k подряд располагающихся блоков N1, …
N2k.
Затем копируем информацию из старых k блоков в первую половину новых блоков, т. е. в блоки N1, … Nk соответственно.
B1, …, Bk помечаются как свободные.
Запись далее осуществляется в Nk+1.
Nk+2, …, N2k, помечаются как зарезервированные
Слайд 17k = 2x, x = c
Заканчиваем текущую группу блоков, в ней уже
есть m = 2c блоков.
Начинаем формировать новую группу блоков.
Слайд 18Остальные случаи
Используем зарезервированные ранее блоки (в случае k = 2x, x <
c)
Слайд 19Эффективное использование дисковой памяти
B-дерево, в нем хранятся слова
Информация о вхождениях слова сохраняется
в списке блоков
Слайд 20Эффективное использование памяти
Все базовые формы разделяются на n групп. Используем n временных
файлов. Вначале читаем документы, записываем информацию о вхождениях для i-й группы в i-й временный файл.
При создании индекса обрабатываем отдельную группу. Кэш используется только для одной группы.
Слайд 21Сравнение с существующими
разработками
Общий объем 35,2 гб, 191 074 файла
Все файлы были
в кодировке Windows-1251 (CP1251).
Язык документов – русский.
Все файлы представляли собой обычный текст.
Слайд 22Описание конфигурации оборудования
Процессор: Intel Core 2 Duo E6700, 2.66 GHz, кэш:
L1 Data – 2 x 32 кб, L1 inst. 2 x 32 кб, L2 – 4096 кб.
Оперативная память: 4 гб, DDR2 800.
Жесткий диск: Seagate Barracuda 7200.10, 7200 RPM, кэш 16 мб., объем 750 гб.
FSB 1066 MHz.
Слайд 23Создание индекса
Создание инвертированного файла: время 9 часов, размер 40 гб.
Создание CLB индекса:
время 3 часа, 32 мин., размер 24 гб.
Для CLB индекса использовался размер блока 16 КБ.
Слайд 24Добавление в индекс одного файла среднего размера
Время добавления одного документа 1,2
мб. для CLB индекса: 9 мин.
Время добавления одного документа 1,2 мб. в инвертированный файл: 57 мин.
Слайд 25Добавление в индекс одного файла малого размера
Время добавления одного документа размером
534 байта для CLB индекса: 22 с.
Время добавления одного документа размером 534 байта в инвертированный файл: 57 мин (т. е. такое же, как при размере файла 1,2 мб).
Слайд 26Время поиска
Время поиска в инвертированном файле и CLB-индексе практически совпадают.
Слайд 27Выводы
Проведенные эксперименты показывают высокую эффективность CLB индекса при добавлении в него данных
небольшого размера.
Слайд 28Сравнение с существующими
разработками
Процессор: Intel Pentium 4, 3.0 GHz, кэш: L1
Data – 16 кб, L1 trace – 12 Kuops, L2 - 2048 кб.
Оперативная память: 4 гб, DDR2 533.
Жесткий диск: Seagate Barracuda 7200.8, 7200 RPM, кэш 8 мб., объем 200 гб.
FSB: 800 MHz.
Слайд 29Создание CLB индекса
Размер индекса 26,2 гб.
Время создания 5 часов 49 мин.
Использовался
размер блока 16 КБ.
Слайд 30SearchInform Desktop (http://www.searchinform.com)
Размер индекса 16,15 гб.
Время создания 9 часов.
Слайд 31Архивариус 3000
http://www.likasoft.com/
Размер индекса 24,83 гб.
Время создания 6 часов 46 мин.
Слайд 32Google Desktop
Размер индекса ~ 5 гб
Время создания 31 час 25 минуты
Слайд 33Выводы
Эксперименты показывают высокую скорость создания CLB индекса.
Слайд 34Эксперименты
Общий объем 86 гб, 400 049 файла
Все файлы были в кодировке Windows-1251
(CP1251).
Язык документов – русский.
Все файлы представляли собой обычный текст.
Слайд 35Описание конфигурации оборудования
Процессор: Intel Core 2 Duo E6700, 2.66 GHz, кэш: L1
Data – 2 x 32 кб, L1 inst. 2 x 32 кб, L2 – 4096 кб.
Оперативная память: 4 гб, DDR2 800.
Жесткий диск: Seagate Barracuda 7200.10, 7200 RPM, кэш 16 мб., объем 750 гб.
FSB 1066 MHz.
Слайд 36Создание CLB индекса
Размер индекса 56,5 гб.
Время создания 4 часа 28 минут.
Использовался размер
блока 64 КБ.
Слайд 37Инвертированные файлы
Размер индекса 117,7 гб.
Время создания 20 часов 6 минут.
Слайд 38Архивариус 3000
http://www.likasoft.com/
Размер индекса 62,65 гб.
Время создания 6 часов 10 минут.
Слайд 39Инструментарий
Автором разработана библиотека для создания индексов и поиска в текстах, в которой
реализована описанная структура данных и алгоритмы.
Слайд 40Форматы файлов
Библиотека может индексировать файлы в различных форматах, например RTF, PDF, CHM,
HTML, DJVU и кодировках, например UNICODE, UTF8, CP1251, ASCII, KOI8.
Слайд 41Архивы
Поддерживается обработка архивов форматов ZIP, CAB, RAR, 7Z, ARJ, TAR, и др.
Слайд 42Архитектура
Библиотека реализована в виде COM сервера для операционных систем Windows
Написана на C++.
Слайд 43Архитектура
Ядро, осуществляет создание индекса и поиск.
Модуль поддержки морфологии
Модуль распознавания кодировки. При
распознавании кодировки также учитывается морфология.
Слайд 44Форматы файлов
Модуль поддержки форматов файлов. Поддержка форматов файлов и архивов реализована с
помощью подключаемых дополнительных модулей, которые могут быть реализованы в виде динамических библиотек или написаны на Java. Модуль поддержки форматов файлов реализован в виде отдельного процесса для повышения надежности системы.
Слайд 45Архитектура
Модуль атрибутов документов, для сохранения описания документов.
Модуль репозитария, для сохранения текстов документов.
Создается для того, чтобы при поиске можно было быстро получать фрагмент текста, содержащий найденную фразу.
Слайд 46Архитектура
Модуль COM осуществляет доступ к остальным модулям извне с помощью COM, что
позволяет использовать библиотеку в различных языках программирования.
Слайд 47Системные требования
Реализованные алгоритмы достаточно нетребовательные к ресурсам компьютера. Для создания индекса достаточно
иметь 300–400 мегабайт свободной оперативной памяти.
Автором проводились эксперименты по созданию индексов на машине с оперативной памятью размером 512 мб.
Слайд 48SSD
Эффективность описанных в данном алгоритмов значительно возрастет с применением дисков SSD (Solid-state
drive), за счет более быстрого чтения блоков малого размера. При этом эффективность таких структур данных как инвертированные файлы возрастет менее, т. к. для добавления в инвертированный файл информации его все равно придется практически переписать целиком.