Коммиты Lucene очень медленные

Мне нужно загрузить путь к файлу и содержимое более 100 тыс. Файлов. Эти файлы различаются по размеру, а некоторые могут быть довольно большими. При тестировании с 2-3k файлами фиксация занимает несколько секунд. При тестировании со 100k файлами приложение зависает на несколько часов (возможно, на неопределенный срок).

Так я создаю писателя.

final IndexWriterConfig config = new IndexWriterConfig(analyzer);
config.setOpenMode(OpenMode.CREATE_OR_APPEND);

final TieredMergePolicy t  = new TieredMergePolicy();
t.setForceMergeDeletesPctAllowed(.01);
config.setMergePolicy(t);
config.setRAMBufferSizeMB(128);

writer = new IndexWriter(directory, config);
writer.forceMergeDeletes();
writer.commit();

Каковы возможные решения этого?

Вы всегда можете начать с увеличения размера буфера RAM со 128 МБ до чего-то намного большего. Не забудьте также проверить размер кучи, если у вас слишком мало памяти, вы тратите все свое время на сборку мусора.

ewramner 06.07.2018 13:30

Насколько больше? Максимальный объем оперативной памяти, который мы можем предоставить, составляет 12 ГБ. Также помогло бы, если бы я совершал более часто (например, каждые 5 минут)? Я задавался вопросом, не потому ли, что я тоже делаю это массово в конце.

Michael 06.07.2018 13:37

Измерьте, я не могу сказать. 128М очень мало. Возможно, вы можете начать с 1 ГБ для буфера и 8 ГБ для кучи и посмотреть, что произойдет. Увеличение / уменьшение и измерение. Плюс не забудьте зарегистрировать активность GC.

ewramner 06.07.2018 14:03

Другое решение - фиксировать файлы по несколько за раз.

Stephen C 06.07.2018 16:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
110
0

Другие вопросы по теме