我在Lucene .Net中使用IndexWriter编写了许多文档。由于提交文件的成本很高,我想知道在提交之前是否有最佳数量的文件要添加。显然太多了,如果发生崩溃,你可能会失去内存中的所有内容,而且经常会像每个文档添加限制吞吐量一样。
答案 0 :(得分:0)
在达到非常高的数字之前,似乎没有出现性能损失。
Total time to commit [10] messages was [00:00:00.1093779]
Total time to commit [20] messages was [00:00:00.0156221]
Total time to commit [40] messages was [00:00:00]
Total time to commit [80] messages was [00:00:00.0312509]
Total time to commit [160] messages was [00:00:00.0156231]
Total time to commit [320] messages was [00:00:00.0156273]
Total time to commit [640] messages was [00:00:00.0312489]
Total time to commit [1280] messages was [00:00:00.0312509]
Total time to commit [2560] messages was [00:00:00.0500343]
答案 1 :(得分:0)
对于这个看似简单的问题,这不是一个好的答案。除了"它取决于" ...
这取决于很多事情,例如:
你最好设置" setRAMBufferSizeMB"而不是" setMaxBufferedDocs"。限制使用的内存量使基础架构需求更具可预测性。默认情况下,lucene按内存大小刷新(默认为16MB)。
还有另一种方法。将缓冲区大小设置为相当高的数字。但也有一个定期提交的计时器。这样可以在缓冲和您可能失去的时间之间取得平衡。更新。
是否有递增的" ID"与文档相关联?如果是这样,请确保它是一个字段。然后在启动时,您可以通过使用ID降序排序进行查询来查询最新的文档(例如"按ID desc选择前1个顺序")并从那里重新启动更新。
如果没有ID,则添加一个数字日期字段并将DateTime.UtcNow.Ticks放入其中。这将成为您的更新光标"。
要记住的另一件事是搜索延迟。摄取文档和可搜索文档之间的时间量。您可以遵循NRT模式,几乎完全是最新的。但是有成本。或者您可以确定某些延迟是可以接受的。在这种情况下,您可以更明智地决定何时刷新Reader / Searcher。
更多的概念性讨论。如果您可以提供有关各种问题和参数的更多详细信息,我可以更具体。