Lucene - 内存不足错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lucene - 内存不足错误相关的知识,希望对你有一定的参考价值。

我想在索引中存储大量文件内容(超过75000个文件,大小约为5-100MB),并使用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的内存使用量?

答案

您可以按块执行lucene数据索引块。如果是完整数据索引,请在IndexWriterConfig CREATE模式下执行第一个块数据索引。

 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对象没有在内存中收集垃圾导致内存不足问题。

以上是关于Lucene - 内存不足错误的主要内容,如果未能解决你的问题,请参考以下文章

处理大型数据集时出现内存不足错误

Excel表单对象限制?内存不足编译错误

独立 matlab 应用程序的“内存不足”错误 - 内存碎片

内存不足错误:Java 堆空间

内存不足错误,java堆空间

在 PHP 中执行大型 SQL 查询字符串时出现“内存不足”错误