2016-02-19 4 views
1

Я пишу много документов, используя IndexWriter в Lucene .Net. Поскольку есть затраты на добавление документов, мне интересно, есть ли оптимальное количество документов для добавления до их совершения. Очевидно, слишком много, и если есть крах, вы рискуете потерять все в памяти, слишком часто, как после каждого документа добавляется пропускная способность дроссельной заслонки.Lucene .NET frequency of IndexWriter commit

ответ

0

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

Total time to commit [10] messages was [00:00:00.1093779] 
Total time to commit [20] messages was [00:00:00.0156221] 
Total time to commit [40] messages was [00:00:00] 
Total time to commit [80] messages was [00:00:00.0312509] 
Total time to commit [160] messages was [00:00:00.0156231] 
Total time to commit [320] messages was [00:00:00.0156273] 
Total time to commit [640] messages was [00:00:00.0312489] 
Total time to commit [1280] messages was [00:00:00.0312509] 
Total time to commit [2560] messages was [00:00:00.0500343] 
0

Это нехороший ответ на этот вопрос, казалось бы, простой. Кроме «это зависит» ...

Это зависит от многих вещей, таких как:

  • Насколько велик каждый документ? Если они большие (много полей, большие поля), то число будет довольно небольшим, если произойдет сброс
  • Что такое прецедент? Вы вкладываете в объем? Если да, то высокое значение «лучше», меньше IO = более высокая пропускная способность. Вам требуется, чтобы документ был зафиксирован/сохранен/долговременен. Затем вы должны зафиксировать каждое добавление/обновление. Много IO, но если частота низкая. Тогда есть бесконечный спектр между ними.

Лучше установить «setRAMBufferSizeMB», а не «setMaxBufferedDocs». Ограничение объема используемой памяти делает инфраструктуру более предсказуемой. По умолчанию lucene сбрасывается по размеру памяти (по умолчанию 16 МБ).

Существует также другой подход. Установите размер буфера на довольно большое число. Но также есть таймер для совершения периодически. Это дает баланс между буферизацией и периодом, в течение которого вы можете «потерять» обновления.

Есть ли приращение «ID», связанное с документом? Если да, убедитесь, что это поле. Затем при запуске вы можете запросить самый последний документ, выполнив запрос с сортировкой по идентификатору (например, «выберите верхний 1 порядок по идентификатору») и перезапустите обновления оттуда.

Если идентификатора нет, то добавьте числовое поле даты и поместите DateTime.UtcNow.Ticks в него. Это станет вашим «курсором обновления».

Другая вещь, которую нужно иметь в виду - поиск латентности. Количество времени между проглатыванием документа и возможностью поиска. Вы можете следовать шаблону NRT и быть почти полностью обновленным. Но есть стоимость. Или вы можете решить, что некоторая латентность приемлема. В этом случае вы можете принять более разумные решения о том, когда обновлять Reader/Searcher.

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

Смежные вопросы