我想在索引中存储大量文件内容(超过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的内存使用量?
答案 0 :(得分:0)
您可以按块执行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对象都没有在内存中收集垃圾,导致内存不足问题。