【发布时间】:2018-11-01 02:31:33
【问题描述】:
我想在索引中存储大量文件内容(超过 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 的内存使用量?
【问题讨论】:
-
在什么操作中你有oom?您是否尝试过定期刷新/提交内容?
-
示例中的文档添加循环期间。我试过在这些之后放置刷新/提交。我有一种感觉,高内存使用率是因为加载了很多文件,并且它在内存中存储了用于搜索的东西。
-
您可以尝试每 10-100 个文档提交一次吗?最后没有?
-
我的意思是我已经尝试在循环中添加刷新/提交,所以每次都会调用它。我也尝试过每隔几分钟运行一个单独的循环刷新/提交。
-
你真的需要将大文本存储在索引中吗?如果您只是要搜索这些文档并返回文档 ID 或文档标题,则无需将文档正文存储在索引中