#lucene #lucene.net
#lucene #lucene.net
Вопрос:
У меня есть индекс, который в настоящее время занимает около 1 ГБ места и содержит около 2,5 миллионов документов. Индекс хранится на твердотельном накопителе для ускорения. Я добавляю 2500 документов одновременно и фиксирую после добавления каждого пакета. Индекс является «живым» индексом и должен обновляться в течение дня и ночи, поэтому очень важно минимизировать скорость записи. Я использую коэффициент слияния 10 и никогда не вызываю Optimize()
, а позволяю индексу оптимизировать себя по мере необходимости на основе коэффициента слияния.
Мне нужно фиксировать документы после добавления каждого пакета, потому что я записываю этот факт, чтобы в случае сбоя или перезапуска приложения оно могло продолжить с того места, где остановилось. Если бы я не зафиксировал, сохраненное состояние не соответствовало бы тому, что находится в индексе. Я предполагаю, что мои добавления, удаления и обновления будут потеряны, если writer будет уничтожен без фиксации.
В любом случае, я заметил, что после произвольного периода времени, который может составлять от двух минут до двух часов, и некоторого переменного количества предыдущих коммитов, индексатор, похоже, зависает в IndexWriter.AddDocument(doc)
методе, и я ни за что на свете не могу понять, почему он зависает или как это исправить. Блок может оставаться на месте более двух часов, что кажется странным для индекса, занимающего менее 2 ГБ при малом количестве документов и имеющего SSD-накопитель для работы.
Что может привести к блокировке addDocument? Существуют ли какие-либо диагностические утилиты Lucene, которые могли бы мне помочь? Что еще я мог бы найти, чтобы отследить проблему?
Комментарии:
1. Я предполагаю, что вы используете ConcurrentMergeScheduler?
2. Согласно документации, ConcurrentMergeScheduler является планировщиком слияния по умолчанию.
3. Это правда, просто пытаюсь убрать очевидное с пути.
4. Я не уверен, что Lucene. NET поддерживает IndexWriter. SetInfoStream() но если вы перенаправите этот вывод на что-то, что вы можете проверить, это может дать вам подсказку.
5. Да, это поддерживает это. Я бы также подкласс ConcurrentMergeScheduler, и переопределить методы Domerge и HandleMergeException, и записывать журнал всякий раз, когда вызываются эти методы. Слияние определенно вызовет нагрузку на ваш дисковый ввод-вывод.
Ответ №1:
Вы можете использовать IndexWriter.SetInfoStream() перенаправляет вывод диагностики в поток, который может дать вам подсказку о том, что не так.