【问题标题】:Lucene - Out of Memory ErrorLucene - 内存不足错误
【发布时间】: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 或文档标题,则无需将文档正文存储在索引中

标签: java indexing lucene


【解决方案1】:

您可以逐块执行 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 对象没有在内存中被垃圾收集,从而导致内存不足问题。

【讨论】:

  • 感谢您的回复。我现在正在尝试这个。在 Lucene 5 中,作者似乎没有优化方法。有其他选择吗?
  • 4.0以上好像没有optimize()方法。版本。不需要使用这个。在 3.6 文档中,它提到了 @Deprecated public void optimize()throws CorruptIndexException,IOException 此方法已被弃用,因为它效率极低且很少有正当理由。 Lucene 的多段搜索性能随着时间的推移而提高,并且默认的 TieredMergePolicy 现在以删除段为目标。 lucene.apache.org/core/3_6_0/api/core/org/apache/lucene/index/…
猜你喜欢
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
  • 2020-10-15
  • 2014-10-21
  • 2016-10-20
  • 2013-01-17
相关资源
最近更新 更多