2012-12-19 57 views
3

我有一个Lucene.net索引,包含10个字段,其中一些存储了一些索引,其中有4.6亿个文档。该指数约为250GB。我使用的是Lucene.net 3.0.3,每次我搜索时我都会轻易地在内存中占用2GB以上的空间,这会导致我的32位应用程序出现内存异常。不幸的是,由于其他32位依赖关系,我无法将该应用程序作为64位进程运行。Lucene.net内存耗尽大型索引

据我知道我下面Lucene的最佳做法:

  • 一个开放式指数作家,在批次

  • 共享阅读器不会关闭写入文件和跨重新本身搜索

  • 索引搜索器的termInfosIndexDivisor设置为4,这似乎没有什么区别。我甚至尝试将它设置为像1000这样大的东西,但没有注意到任何内存变化。

  • 不需要进行子库搜索的字段不会被分析(即仅全字符串搜索),并且不需要从搜索中恢复的字段不会被存储。

  • 我使用默认StandardAnalyzer进行索引和搜索。

  • 如果我修剪数据并制作一个较小的索引,那么事情就会奏效。当我有一个指数,它环绕50GB大小我只能与有关的RAM 600MB搜吧

不过,我确实有应用上的一个字段排序,但即使没有排序的内存使用情况对于任何搜索都很重要。我并不特别关心文档分数,更重要的是该文档存在于我的索引中,但我不确定是否忽略分数计算将有助于内存使用。

我最近从Lucene.net 2.9.4升级到Lucene.net 3.0.3,认为这可能有帮助,但内存使用情况在两个版本之间看起来差不多。

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

如果任何人有任何建议,我可以做些什么,这将是很好的可用。如果可能,我愿意为内存使用牺牲搜索速度。

回答

5

您可以在64位运行应用程序 - 为lucene零件制作一个单独的进程,使用远程处理与它通信(或WCF)。成品。标准方法。

你考虑拆分它,所以,把它隔离起来放在64位上。

+0

这是一个不错的主意,我可能必须这样做。但我是否认为在32位进程中运行这种索引是不可行的?我想确保我以后不会在单独的应用程序中遇到同样的问题,因为我错过了某种Lucene调优机会。 – devshorts

+1

好,严重的是,即使它是可行的 - 你也不希望在RAM中缓存大部分索引。因为任何IO到光盘都很慢。与可用内存相比,您的数据库大小使得基于光盘的操作成为可能。这总是很慢。你知道,来自数据库的旧规则。 – TomTom