提问者:小点点

Lucene.net内存溢出


我有一个Lucene.net索引,有10个字段,一些存储,一些索引,4.60亿文档。索引约为250GB。我使用Lucene.net3.0.3,每次我做搜索时,我很容易在RAM中吃掉2GB,这导致我的32位应用程序获得内存溢出异常。不幸的是,由于其他32位依赖项,我无法将应用程序作为64位进程运行。

据我所知,我遵循Lucene的最佳实践:

>

  • 一个开放的索引编写器,可以批量编写文档

    一个共享阅读器,不会在搜索过程中关闭和重新打开自己

    索引搜索器有一个termInfoIndexDivisor设置为4,这似乎没有什么区别。我甚至尝试将其设置为1000之类的巨大值,但没有注意到任何内存变化。

    不需要子搜索的字段不会被分析(即仅搜索完整字符串),不需要从搜索中检索回来的字段不会被存储。

    我使用默认的Standard ardAnalyzer进行索引和搜索。

    如果我修剪数据并创建一个更小的索引,那么事情就会奏效。当我有一个大约50GB的索引时,我可以用大约600MB的RAM来搜索它

    但是,我确实在其中一个字段上应用了排序,但即使没有排序,任何搜索的内存使用量也是巨大的。我并不特别关心文档分数,更多的是文档存在于我的索引中,但我不确定以某种方式忽略分数计算是否有助于内存使用。

    我最近从Lucene.net2.9.4升级到Lucene.net3.0.3,认为这可能会有所帮助,但两个版本之间的内存使用情况看起来大致相同。

    坦率地说,我不确定这个索引是否太大,以至于一台机器无法轻松搜索。我发现的大多数例子都在谈论20-30GB或更小的索引,所以这可能是不可能的,但我至少想问一下。

    如果有人对我能做些什么来使它可用有任何建议,那就太好了。如果可能的话,我愿意牺牲搜索速度来使用内存。


  • 共1个答案

    匿名用户

    您CAN以64位运行应用程序-为Lucene部分创建一个单独的进程,使用远程处理与它(或WCF)通信。完成。标准方法。

    你已经考虑拆分它了,所以见鬼,隔离它并把它放在64位上。