【发布时间】:2011-11-05 22:47:11
【问题描述】:
我有一个索引,目前占用大约 1gb 的空间,有大约 250 万个文档。索引存储在固态驱动器上以提高速度。我一次添加 2500 个文档,并在添加每个批次后提交。该索引是一个“实时”索引,需要在白天和晚上保持最新,因此最小化写入速度非常重要。我使用的合并因子为 10,并且从不调用 Optimize(),而是允许索引根据合并因子根据需要优化自身。
我需要在添加每个批次后提交文档,因为我会记录这一事实,以便在应用程序崩溃或重新启动时,它可以从中断处继续。如果我不提交,存储的状态将与索引中的内容不一致。我假设如果作者在没有提交的情况下被销毁,我的添加、删除和更新都会丢失。
无论如何,我注意到在任意时间段之后,可能是两分钟或两小时以及之前提交的一些可变数量,索引器似乎停止在 IndexWriter.AddDocument(doc) 方法上,我可以' t 为我的生活弄清楚它为什么会停止或如何解决它。该块可以保留两个小时以上,对于在数百万个文档中占用不到 2GB 的索引并且有一个 SSD 驱动器可以使用来说,这似乎很奇怪。
什么可能导致 AddDocument 阻塞?是否有任何 Lucene 诊断实用程序可以帮助我?我还能寻找什么来追踪问题?
【问题讨论】:
-
我假设您正在使用 ConcurrentMergeScheduler?
-
ConcurrentMergeScheduler 是默认的合并调度程序,根据文档。
-
这是真的,只是想把显而易见的事情排除在外。
-
我不确定 Lucene.NET 是否支持 IndexWriter.SetInfoStream() 但如果您将此输出重定向到您可以检查的内容,它可能会为您提供线索。
-
是的,它确实支持。我还将继承 ConcurrentMergeScheduler,并覆盖 Domerge 和 HandleMergeException 方法,并在调用这些方法时写入日志。合并肯定会对您的磁盘 IO 造成压力。
标签: lucene lucene.net