- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу

Маркетинг для шоколадной фабрики. На 34% выше средний чек
Через устранение узких мест
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Допустим есть прямой индекс который в оперативной памяти не умещается, хранится на диске и строится достаточно легко.
Как не загружая в память прямой индекс создать обратный также не формируя его в памяти - сразу на диске.
Какие есть варианты?
Где посмотреть?
Где почитать?
Йоу... вы о чем?
Йоу... вы о чем?
Я говорю про создание поисковика не средствами СУБД.
Допустим есть прямой индекс который в оперативной памяти не умещается, хранится на диске и строится достаточно легко.
Как не загружая в память прямой индекс создать обратный также не формируя его в памяти - сразу на диске.
Какие есть варианты?
Где посмотреть?
Где почитать?
По кусочкам. Считываешь первые 64Кб прямого индекса. Строишь куски обратного, сбрасываешь на диск. Считываешь следующий кусок прямого индекса. Строить куски обратного, сбрасываешь на диск. И так до конца прямого индекса.
А как просто большой индекс делать:
допустим есть такие поля
5*4 байта = 20 байт
Хотелось бы чтобы вся эта структура хранилась в памяти для быстрого определения смещения в файле по заданному ключу.
Но как это можно хранить в памяти если id несколько десятков миллионов (хотябы) - 20*50 000 000 = 1Гб
Или в таких ситуациях индекс раниться частично на диске ?
Хотелось бы чтобы вся эта структура хранилась в памяти для быстрого определения смещения в файле по заданному ключу.
Но как это можно хранить в памяти если id несколько десятков миллионов (хотябы) - 20*50 000 000 = 1Гб
Или в таких ситуациях индекс раниться частично на диске ?
Разбиваете обратный индекс по словам. Для каждого слова свой файл с обратным индексом. Файлы хранятся на диске. Если требуется большая производительность и время чтения с диска критично, то кидаете часто используемые файлы в memcached.
Соответственно, при построении обратного индекса Вы берёте базу документов и создаёте прямой индекс, сбрасывая его постепенно на диск (незачем ему хранится в памяти целиком). Затем для каждого уникального слова по очереди проходитесь по прямому индексу, составляете обратный индекс для этого слова, файл сбрасываете на диск. Таким образом, Вы можете индексировать базы любого размера. Правда количество проходов по прямому индексу получается равно количеству уникальных слов. Но это можно оптимизировать 🙄 Самое узкое место - дисковая подсистема. Это уже лечится только добавлением памяти.
Тут я делаю проход по прямому индексу не для одного уникального слова а для определенного интервала - так меньше проходов требуется.
Тут я делаю не так. Если для каждого слова использовать файл то время доступа к списку вхождений увеличивается из-за дополнительного поиска по файловой системе, не говоря уже про то что миллионы файлов в каталоге это многовато. Я весь обратный индекс храню в одном файле, а списки вхождения для слов нахожу по смещению в нем.
Но это мелочи - проблема не здесь.
Проблема в том что индекс "имен файлов" в оперативной памяти не умещается.
Кстати нету случайно статьи "J. Jobel, A. Moffat. Inverted Files for Text Search Engines, ACM Computing Surveys, Vol. 38, No. 2. (2006)"
скачать не получается ?
Тут я делаю проход по прямому индексу не для одного уникального слова а для определенного интервала - так меньше проходов требуется.
Я так же делаю. ;)
Тут я делаю не так. Если для каждого слова использовать файл то время доступа к списку вхождений увеличивается из-за дополнительного поиска по файловой системе, не говоря уже про то что миллионы файлов в каталоге это многовато. Я весь обратный индекс храню в одном файле, а списки вхождения для слов нахожу по смещению в нем.
Но это мелочи - проблема не здесь.
Миллионы файлов это многовато. Но если использовать стемку, то их количество сильно уменьшается. Тысяч до ста, а с этим линуксы уже справляются. Можно ещё посмотреть в сторону BerkeleyDb - я пока не тестировал на необходимость беркли, но должно быть лучш. Если Вы храните индекс в одном файле, то там есть маленькая проблема. Добавление/удаление/изменение документа приводит к значительным операциям с этим файлом. Даже если он весь хранится в памяти, то сдвиги сотен мегабайт данных в памяти не сказка. Если кусочек оказывается на диске, то вообще получаются ужасы. С кучей маленьких файлов таких проблем нет.
Проблема в том что индекс "имен файлов" в оперативной памяти не умещается.
Самый простой способ в Вашем случае хранить файл на диске, а смещения и часть индекса держать в памяти (кешь).
Интересно, а раззиповка индексных файлов из памяти работает быстрее, чем чтение с диска?
Интересно, а раззиповка индексных файлов из памяти работает быстрее, чем чтение с диска?
Да, и требует больше памяти.