Lucene - Ошибка памяти

Michael спросил: 28 апреля 2018 в 09:02 в: java

Я хотел бы хранить большое количество содержимого файла (более 75000 файлов размером около 5-100 МБ) в индексе и запускать поиск по нему с помощью Lucene 5.I'm с помощью FSDirectory и I 'писать все содержимое файла с помощью IndexWriter. По мере того, как записывается больше файлов, использование памяти увеличивается до тех пор, пока не будет выбрано исключение Out of Memory.

Вот пример того, как я сейчас это делаю.

Analyzer analyzer = new StandardAnalyzer();
FSDirectory directory = FSDirectory.open(indexFilePath);
DirectoryReader reader = DirectoryReader.open(directory);   IndexWriterConfig config = new IndexWriterConfig(analyzer);IndexWriter writer = new IndexWriter(directory, config);for (Document document : documents)
{
    writer.addDocument(document);
}writer.close();

Я изменяю параметры, подобные этим для конфигурации, но я не заметил различий.

config.setMaxBufferedDocs(2);
config.setRAMBufferSizeMB(32);
config.setRAMPerThreadHardLimitMB(32);

Я также пытался совершить, и принуждение сливается с писателем, но это не влияет на него.

Возможно ли снизить / ограничить использование памяти Lucene?

1 ответ

vishnu ответил: 08 мая 2018 в 05:31

Вы можете выполнить блок индексирования lucene с помощью chunk. Если вы полный индексирование данных, выполните первую индексацию данных блока в режиме CREATE в IndexWriterConfig.

 config.setOpenMode(OpenMode.CREATE);

Для индексирования оставшихся фрагментов данных, установите режим IndexWriterConfig в CREATE_OR_APPEND

config.setOpenMode(OpenMode.CREATE_OR_APPEND);

Это приведет к инкрементной индексации, добавив текущий набор данных к существующему индексу lucene.

Вызвать эти методы в каждой инкрементной индексации индексирования / фрагментации данных.

writer.optimize();
writer.commit();
writer.close(); 

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

TieredMergePolicy t  = new TieredMergePolicy();
t.setForceMergeDeletesPctAllowed(.01);
config.setMergePolicy(t);writer.forceMergeDeletes();
writer.commit();

Это способ сделать блок индексирования куском. Поскольку мы делаем кусок куском. Это освободит память в каждом фрагменте.

Индексация Lucene может быть или не быть основной причиной проблемы с памятью. Используйте Memory Analyzer tool, чтобы проверить, что все объекты java не получают мусор, собранный в памяти, из-за проблемы с памятью.

Michael ответил: 18 мая 2018 в 09:35
Спасибо за ответ. Я пытаюсь это сделать сейчас. В Lucene 5 в писателе не существует оптимизационного метода. Есть ли альтернатива?
vishnu ответил: 18 мая 2018 в 10:17
Похоже, нет метода optimize () выше 4.0. версии. Не нужно использовать это. В 3.6 документах, упомянутых выше, @Deprecated public void optimize () выдает исключение CorruptIndexException, IOException Этот метод устарел, поскольку он ужасно неэффективен и очень редко оправдан. Многосегментная производительность поиска Lucene со временем улучшилась, и по умолчанию TieredMergePolicy теперь нацеливает сегменты с удалениями. lucene.apache.org/core/3_6_0/api/core/org/apache/lucene/index/...