3

我有一个包含 10 个字段的 Lucene.net 索引,其中一些已存储,有些已编入索引,包含 4.6 亿个文档。索引约为 250GB。我正在使用 Lucene.net 3.0.3,每次进行搜索时,我都会轻松消耗 2GB 以上的 RAM,这会导致我的 32 位应用程序出现内存不足异常。不幸的是,由于其他 32 位依赖项,我无法将应用程序作为 64 位进程运行。

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

  • 一种批量写入文档的开放式索引编写器

  • 不会在搜索中自行关闭和重新打开的共享阅读器

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

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

  • 我对StandardAnalyzer索引和搜索都使用默认值。

  • 如果我修剪数据并制作更小的索引,那么一切都会奏效。当我有一个大约 50GB 大小的索引时,我可以只用大约 600MB 的 RAM 来搜索它

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

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

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

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

4

1 回答 1

5

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

您已经考虑将其拆分,所以见鬼,将其隔离并放在 64 位上。

于 2012-12-19T19:24:23.353 回答