Lucene - Ошибка нехватки памяти - PullRequest
0 голосов
/ 22 мая 2018

Я хотел бы хранить большие объемы файлового содержимого (свыше 75000 файлов с размерами около 5-100 МБ) в индексе и выполнять поиск по нему с помощью Lucene 5. Я использую FSDirectory и пишу всесодержимое файла, используя 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 Ответ

0 голосов
/ 02 июня 2018

Вы можете выполнить фрагмент индексации данных lucene по фрагменту.Если вы выполняете полную индексацию данных, выполните индексацию данных первой порции в режиме 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 не получают мусор в памяти, вызывающий проблему нехватки памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...