optimization - 写入 Lucene.Net 索引时内存使用量不断增长

标签 optimization nlp lucene.net information-retrieval

我打开这个讨论是因为谷歌搜索了 Lucene.Net 的使用,但我没有发现任何真正有用的东西。 问题很简单:我在构建和更新 Lucene.Net 索引时遇到问题。特别是即使我将 SetRAMBufferSizeMB 固定为 256,将 SetMergeFactor 固定为 100 并将 SetMaxMergeDocs 固定为 100000,它的内存使用量仍在不断增长。此外,每次使用索引时我都会仔细使用 Close() 和 Commit() 方法。

为了使 lucene.Net 适用于我的数据,我从本教程开始:http://www.lucenetutorial.com/lucene-in-5-minutes.html

对于 10^5 和 10^6 的文档,似乎需要 1.8GB 的​​内存。因此,如果实际 RAM 使用量是 7 倍,为什么还要设置 SetRAMBufferSizeMB 参数?有谁真的知道如何限制内存使用量?

此外,我发现要处理 10^5 或 10^6 的文档,必须为 x64 平台编译 Lucene.Net。事实上,如果我为 x86 平台编译代码,索引崩溃会系统地触及 1.2GB 的 RAM。 有没有人能够使用更少的 RAM 索引相同数量(甚至更多)的文档?在哪个硬件和软件设置中?我的环境配置如下: - 操作系统 := win7 32/64 位。 - sw := .Net 框架 4.0 - hw := 12 核 Xeon 工作站,6GB 内存。 - Lucene.Net rel.:2.9.4g(当前稳定)。 - Lucene.Net目录类型:FSDirectory(索引写入磁盘)。


好的,我根据您关于重新使用文档/字段实例的建议测试了代码,但是代码在内存使用方面的表现完全相同。 在这里,我针对在 1000000 文档的索引过程中跟踪的一些参数发布了一些调试行。

DEBUG - BuildIndex – IndexWriter - RamSizeInBytes 424960B; index process dimension 1164328960B.  4% of the indexing process.
DEBUG - BuildIndex – IndexWriter - RamSizeInBytes 457728B; index process dimension 1282666496B.  5% of the indexing process.
DEBUG - BuildIndex – IndexWriter - RamSizeInBytes 457728B; index process dimension 1477861376B.  6% of the indexing process.

索引过程维度获取方式如下:

很容易观察到进程在 RAM 中的增长速度(~1.5GB6% 的索引进程中)甚至如果 IndexWriter 使用的 RAM 缓冲区或多或少没有变化。因此,问题是:是否可以显式限制索引进程大小的 RAM 使用?我不在乎在搜索阶段性能是否下降以及我是否必须等待一段时间才能完成索引,但我需要确保索引过程不会遇到 OOM 或索引大量文档时发生堆栈溢出错误。如果无法限制内存使用量,我该怎么做?

为了完整起见,我发布了用于调试的代码:

// get the current process
Process currentProcess = System.Diagnostics.Process.GetCurrentProcess();
// get the physical mem usage of the index writer 
long totalBytesOfIndex = writer.RamSizeInBytes();
// get the physical mem usage
long totalBytesOfMemoryUsed = currentProcess.WorkingSet64;

最佳答案

终于,我找到了错误。它包含在 ItalianAnalyzer(意大利语分析器)中,该分析器是利用 Luca Gentili 的贡献构建的 (http://snowball.tartarus.org/algorithms/italian/stemmer.html)。事实上,在 ItalianAnalyzer 类中,一个包含停用词的文件被打开了几次,并且在每次使用后都没有关闭。这就是我出现 OOM 问题的原因。 解决此错误 Lucene.Net 在构建索引和搜索方面都是光速的。

关于optimization - 写入 Lucene.Net 索引时内存使用量不断增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12111528/

相关文章:

javascript - 如何优化这个 JSP/JavaScript 代码?

nlp - 限制用于 BERT 编码器-解码器文本生成的词汇

python - 使用 python 从 html 中删除/**/

c++ - 优化递归函数

search - 是否可以将子目录提交到目录以用于 seo 目的?

c - 如何优化我的递归迷宫求解器?

parsing - 尝试使用 HPSG PET 解析器

c# - 仅根据在 lucene 中术语出现次数较多的文档计算分数

azure - Windows Azure Solr和hadoop数据

azure - 2 个辅助角色、1 个 VHD、自动故障转移