gpt4 book ai didi

java - 更新 Lucene 索引中的文档时如何避免 OutOfMemoryErrors?

转载 作者:行者123 更新时间:2023-11-30 11:52:16 24 4
gpt4 key购买 nike

我正在尝试以增量模式刷新 Lucene 索引,该模式正在更新已更改的文档并保持其他未更改的文档原样。

为了更新更改的文档,我使用 IndexWriter.deleteDocuments(Query) 删除这些文档,然后使用 IndexWriter.addDocument() 添加更新的文档。

IndexWriter.deleteDocuments 中使用的Query 对象包含大约 12-15 个术语。在刷新索引的过程中,有时我还需要通过使用 IndexWriter.deleteDocuments 删除所有文档然后添加新文档来进行完全刷新。

问题是当我在大约 100000 个文档删除后调用 IndexWriter.flush() 时,执行需要很长时间并抛出 OutOfMemoryError。如果我禁用刷新,索引会快速上升到 2000000 次文档删除,然后它会抛出 OutOfMemoryError。我试图将 IndexWriter.setRAMBufferSizeMB 设置为 500 以避免内存不足错误,但没有成功。索引大小为 1.8 GB。

最佳答案

首先。增加 RAM 缓冲区不是您的解决方案。据我所知,它是一个缓存,我宁愿争辩说它正在增加你的问题。 OutOfMemoryError 是一个 JVM 问题,而不是 Lucene 的问题。您可以将 RAM 缓冲区设置为 1TB - 如果您的 VM 没有足够的内存,那么您无论如何都会遇到问题。因此,您可以做两件事:增加 JVM 内存或减少消耗。

其次。您是否已经考虑过增加堆内存设置?刷新需要很长时间的原因是系统在内存用完之前不久进行了大量垃圾收集。这是一个典型的症状。您可以使用 jvisualvm 等工具进行检查。您需要先安装 GC 详细信息插件,然后您可以选择和监控您疯狂的 OutOfMemory 应用程序。如果您了解到您的内存问题,您可以像这样增加最大堆空间:

java -Xmx512M MyLuceneApp (or however you start your Lucene application)

但是,我还是会先使用工具来检查您的内存消耗情况和垃圾回收行为。您的目标应该是避免内存不足,因为这会导致垃圾收集降低您的应用程序的性能。

第三。现在,如果您增加堆,则必须确保您也有足够的 native 内存。因为如果你不这样做(在 Linux 上使用像 top 这样的工具检查)你的系统将开始交换到磁盘,这也会疯狂地打击 Lucene 的性能。因为 Lucene 针对顺序磁盘读取进行了优化,如果您的系统开始交换,您的硬盘将进行大量磁盘寻道,这比顺序读取慢 2 个数量级。所以情况会更糟。

第四。如果你没有足够的内存考虑批量删除。在 1,000 或 10,000 个文件进行冲洗后,然后一次又一次。出现此 OutOfMemoryError 的原因是 Lucene 必须将所有内容保存在内存中,直到您进行刷新。因此,无论如何不允许刷新太大的批处理可能是个好主意,以避免将来出现问题。

关于java - 更新 Lucene 索引中的文档时如何避免 OutOfMemoryErrors?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6956694/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com