java - 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 模式下执行第一个 chunk 数据索引。
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 对象没有在内存中收集垃圾,从而导致内存不足问题。
推荐阅读
- javascript - 当我单击单选按钮时,它的 true 或自动其他 Span 值变为 false
- haskell - 对列表中的一对列表 Haskell
- reactjs - 使用 HOC、React Context 和 componentDidMount API 从 Firebase 获取 uid
- c# - System.Data.SqlClient.SqlException:''('.' 附近的语法不正确。'
- java - 在 Spring Web 应用程序中创建自定义 JSONresponse
- javascript - 比较数组并添加?
- angular - 如何在我的 ionic4 应用程序中检索特定的详细信息
- elasticsearch - Kibana 6.5.4 创建索引模式卡住
- python - Pandas 从列名不同的行中选择数据
- ios - 在另一个类中使用用户选择的结构