Java Lucene-内存不足错误

Java Lucene-内存不足错误,java,indexing,lucene,Java,Indexing,Lucene,我想在索引中存储大量文件内容(超过75000个文件,大小约为5-100MB),并使用Lucene 5对其进行搜索。 我正在使用FSDirectory,我正在使用IndexWriter写入所有文件内容。当写入更多文件时,内存使用量会增加,直到最终引发内存不足异常 下面是一个我目前如何做这件事的例子 Analyzer analyzer = new StandardAnalyzer(); FSDirectory directory = FSDirectory.open(indexFilePath);

我想在索引中存储大量文件内容(超过75000个文件,大小约为5-100MB),并使用Lucene 5对其进行搜索。 我正在使用
FSDirectory
,我正在使用
IndexWriter
写入所有文件内容。当写入更多文件时,内存使用量会增加,直到最终引发
内存不足
异常

下面是一个我目前如何做这件事的例子

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创建模式下执行第一个区块数据索引

 config.setOpenMode(OpenMode.CREATE);
要索引剩余的数据块,请将IndexWriterConfig模式设置为CREATE_或_APPEND

config.setOpenMode(OpenMode.CREATE\u或\u APPEND)

这将通过将当前数据集附加到现有lucene索引来执行增量索引

在每个增量索引/块数据索引中调用这些方法

writer.optimize();
writer.commit();
writer.close(); 
TieredMergePolicy配置也只能在增量索引的情况下显式设置, 用于在搜索时立即将记录的删除、修改或添加反映到索引中

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

writer.forceMergeDeletes();
writer.commit();
这是一种逐块索引的方法。因为我们正在一块一块地做。这将释放每个块中的内存


Lucene索引可能是也可能不是内存不足问题的根本原因。使用
内存分析器工具
检查哪些java对象没有在内存中得到垃圾收集,从而导致内存不足问题

你在做什么手术?在示例中的文档添加循环中,是否尝试定期刷新/提交内容。我已经试过在这些之后刷新/提交。我有一种感觉,内存使用率高是因为加载了很多文件,并且它在内存中存储了用于搜索的内容。你能试着每10-100个文档提交一次吗?不是最后吗?我的意思是我已经尝试在循环中添加flush/commit,所以每次都会调用它。我还尝试过每隔几分钟让一个单独的循环运行flush/commit?如果您只是要搜索这些文档并返回文档ID或文档标题,则不需要将文档正文存储在索引“感谢您的回复”。我现在正在尝试。在Lucene 5中,作者似乎没有一个优化方法。有其他选择吗?似乎4.0以上没有optimize()方法。版本。不用用这个。在3.6文档中提到的@Deprecated public void optimize()抛出corruptindexception,IOException这种方法已经被弃用,因为它效率极低,而且很少有正当理由。Lucene的多段搜索性能随着时间的推移而提高,默认的TieredMergePolicy现在针对删除的段。