[Lucene] IndexReader / Searcher的开销是多少

时间:2011-10-26 09:22:13

标签: performance lucene

Lucene的大多数文档建议保留indexReader的单个实例并重用它,因为打开一个新的Reader会有开销。

但是我发现很难看出这种开销是什么以及它会对它产生什么影响。

与此相关的是开放的IndexReader实际导致的开销是多少?

这个问题的背景是: 我们目前运行一个集群的tomcat堆栈,我们从ServletContainer执行全文。 这些搜索是在每个客户端的单独Lucene索引上完成的,因为每个客户端只搜索自己的数据。这些索引中的每一个都包含从几千到(当前)约100,000个文档。

由于群集的tomcat节点,任何客户端都可以在任何tomcat节点上连接。 因此,保持IndexReader打开实际上意味着在每个tomcat节点上保持几千个indexReader打开。这似乎是一个坏主意,但不断重新开放似乎也不是一个好主意。

虽然我可能会在某种程度上改变我们部署Lucene的方式,如果不需要的话我宁愿不这样做。

1 个答案:

答案 0 :(得分:0)

通常情况下,字段缓存是Lucene最慢的一部分,但其他东西如过滤器和分段指针也会产生影响。缓存中保留的具体数量取决于您的使用情况,尤其是存储了多少数据(而不仅仅是索引)。

您可以使用适合您的环境的任何内存使用调查工具来查看Lucene本身为您的应用程序占用多少,但请记住,“预热成本”也指操作系统和文件系统的各种缓存保持开放,可能不会出现在top或您使用的任何内容中。

你是对的,拥有数千个索引并不常见。标准建议是让它们共享索引并使用过滤器来确保返回适当的结果。

由于您对性能感兴趣,您应该记住,在服务器上有数千个索引会导致数千个文件遍布整个磁盘,这将导致大量的搜索时间,如果你不会发生只有一个大指数。根据您的要求,这可能是也可能不是问题。

作为旁注:听起来你可能正在使用网络文件系统,这对Lucene来说是一个很大的性能影响。