Мне нужно загрузить путь к файлу и содержимое более 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();
Каковы возможные решения этого?
Насколько больше? Максимальный объем оперативной памяти, который мы можем предоставить, составляет 12 ГБ. Также помогло бы, если бы я совершал более часто (например, каждые 5 минут)? Я задавался вопросом, не потому ли, что я тоже делаю это массово в конце.
Измерьте, я не могу сказать. 128М очень мало. Возможно, вы можете начать с 1 ГБ для буфера и 8 ГБ для кучи и посмотреть, что произойдет. Увеличение / уменьшение и измерение. Плюс не забудьте зарегистрировать активность GC.
Другое решение - фиксировать файлы по несколько за раз.




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