我有一个包含 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 或更小的索引,所以也许这是不可能的,但我至少想问一下。
如果有人对我可以做些什么来使它可用有任何建议,那就太好了。如果可能的话,我愿意为内存使用牺牲搜索速度。