写入 Lucene.Net 索引时内存使用量持续增长

dto*_*ato 3 optimization lucene.net nlp information-retrieval

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

\n\n

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

\n\n

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

\n\n

此外,我观察到要处理 10^5 或 10^6 文档,有必要为 x64 平台编译 Lucene.Net。事实上,如果我为 x86 平台编译代码,索引崩溃会系统性地触及 1.2GB RAM。\n是否有人能够使用更少的 RAM 索引相同数量(甚至更多)的文档?在什么硬件和软件设置下?我的环境配置如下:\n- os := win7 32/64 位。\n- sw := .Net Framework 4.0 \n- hw := 具有 6GB RAM 的 12 核 Xeon 工作站。\n- Lucene.Net 版本:2.9.4g(当前稳定版)。\n- Lucene.Net目录类型:FSDirectory(索引写入磁盘)。

\n\n
\n\n

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

\n\n
DEBUG - BuildIndex \xe2\x80\x93 IndexWriter - RamSizeInBytes 424960B; index process dimension 1164328960B.  4% of the indexing process.\nDEBUG - BuildIndex \xe2\x80\x93 IndexWriter - RamSizeInBytes 457728B; index process dimension 1282666496B.  5% of the indexing process.\nDEBUG - BuildIndex \xe2\x80\x93 IndexWriter - RamSizeInBytes 457728B; index process dimension 1477861376B.  6% of the indexing process.\n
Run Code Online (Sandbox Code Playgroud)\n\n

指标过程维数获取如下:

\n\n

即使所利用的缓冲区或多或少没有变化,也很容易观察到进程增长的速度RAM~1.5GB6%索引进程的末尾) 。因此,问题是:是否可以明确限制索引进程大小的使用?我不关心在搜索阶段性能是否下降以及是否必须等待一段时间才能获得完整的索引,但我需要确保索引过程不会遇到索引大量错误或堆栈溢出错误的文件。如果无法限制内存使用,我该怎么办?RAMIndexWriterRAMOOM

\n\n

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

\n\n
// get the current process\nProcess currentProcess = System.Diagnostics.Process.GetCurrentProcess();\n// get the physical mem usage of the index writer \nlong totalBytesOfIndex = writer.RamSizeInBytes();\n// get the physical mem usage\nlong totalBytesOfMemoryUsed = currentProcess.WorkingSet64;\n
Run Code Online (Sandbox Code Playgroud)\n

dto*_*ato 5

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