Lucene.net优化未完成的循环

Lucene.net优化未完成的循环,.net,lucene.net,.net,Lucene.net,我正在使用Lucene.net 2.9.1版,在调用Optimize时遇到以下问题: 我注意到,一些优化调用可能需要几个小时,而当这需要很长的时间时,索引和优化的过程是无法完成的。 当我使用源代码时,我成功地跟踪了问题:导致这种行为的调用是Optimize(int-maxNumSegments,bool-doWait)——在这个方法中,有对optimizemergespensing()的重复调用,它们总是返回true,循环继续工作并调用此方法,直到此调用返回,否则可能需要很长时间 这引发了以下问

我正在使用Lucene.net 2.9.1版,在调用Optimize时遇到以下问题: 我注意到,一些优化调用可能需要几个小时,而当这需要很长的时间时,索引和优化的过程是无法完成的。 当我使用源代码时,我成功地跟踪了问题:导致这种行为的调用是
Optimize(int-maxNumSegments,bool-doWait)
——在这个方法中,有对
optimizemergespensing()
的重复调用,它们总是返回true,循环继续工作并调用此方法,直到此调用返回,否则可能需要很长时间

这引发了以下问题:
1.什么会导致
优化合并支出()
保持返回true?
2.什么会导致终止索引和优化的流程失败?
3.你知道更新版本的Lucene.net是否面临同样的行为吗

感谢

声明它将返回true“如果pendingMerges或runningMerges中的任何合并都是优化合并”。它只会等待一秒钟,以避免出现某些通知可能无法触发的问题,这取决于调用方重新评估等待条件。我已链接到2.9.4g源代码,因此较新版本也包含此行为

一个不可修改的进程是一个操作系统问题,只要它没有在内核/系统调用中被阻塞,您应该始终能够杀死它。我们需要查看进程转储来调试这些问题。(或者更好地解释您是如何试图终止流程的…)

反问题

  • 为什么要调用
    IndexWriter.Optimize
    ?Lucene可以处理几个段,事实上,当只有几个段发生更改时,重新打开索引比重新打开包含整个索引的全新段更容易。如果当前对段的处理有问题,您可以编写自己的
    MergePolicy
    ,Lucene.Net目前落后于此(目前已达到3.0.3,4.x的移植正在进行中)
  • 你有没有锁定过你的IndexWriter?我链接的代码显示,该代码确实锁定了(this){…},这很糟糕,如果您也锁定了编写器,可能会导致死锁问题。这可能会出现代码挂起的情况,并且不会触发您构建的任何干净线程终止(因为线程只是阻塞)
  • 关于不断变化的索引的更新。
  • 切勿调用
    IndexWriter.Optimize()
    ,这将导致不必要的cpu和io负载,无论是在实际合并期间还是在重新打开读卡器时
  • 在单独的线程上或调用IndexWriter.Commit时重新打开阅读器和搜索程序。不要等到用户需要搜索时才重新打开它
  • 调用IndexReader.Reopen()而不是IndexReader.Open()。第一个将只加载已更改的段,并重用已读取但未更改的段。(请记住,删除只是一个单独的位图,它只会重新读取位图,而不会重新读取整个段。)
  • 考虑升级到Lucene.Net 3.0.3,并使用IndexWriter.IndexReaderWarmer编写自定义预热逻辑,以确保在用户开始使用缓存/内存之前,您的数据段已完全读入缓存/内存
  • 声明它将返回true“如果pendingMerges或runningMerges中的任何合并都是优化合并”。它只会等待一秒钟,以避免出现某些通知可能无法触发的问题,这取决于调用方重新评估等待条件。我已链接到2.9.4g源代码,因此较新版本也包含此行为

    一个不可修改的进程是一个操作系统问题,只要它没有在内核/系统调用中被阻塞,您应该始终能够杀死它。我们需要查看进程转储来调试这些问题。(或者更好地解释您是如何试图终止流程的…)

    反问题

  • 为什么要调用
    IndexWriter.Optimize
    ?Lucene可以处理几个段,事实上,当只有几个段发生更改时,重新打开索引比重新打开包含整个索引的全新段更容易。如果当前对段的处理有问题,您可以编写自己的
    MergePolicy
    ,Lucene.Net目前落后于此(目前已达到3.0.3,4.x的移植正在进行中)
  • 你有没有锁定过你的IndexWriter?我链接的代码显示,该代码确实锁定了(this){…},这很糟糕,如果您也锁定了编写器,可能会导致死锁问题。这可能会出现代码挂起的情况,并且不会触发您构建的任何干净线程终止(因为线程只是阻塞)
  • 关于不断变化的索引的更新。
  • 切勿调用
    IndexWriter.Optimize()
    ,这将导致不必要的cpu和io负载,无论是在实际合并期间还是在重新打开读卡器时
  • 在单独的线程上或调用IndexWriter.Commit时重新打开阅读器和搜索程序。不要等到用户需要搜索时才重新打开它
  • 调用IndexReader.Reopen()而不是IndexReader.Open()。第一个将只加载已更改的段,并重用已读取但未更改的段。(请记住,删除只是一个单独的位图,它只会重新读取位图,而不会重新读取整个段。)
  • 考虑升级到Lucene.Net 3.0.3,并使用IndexWriter.IndexReaderWarmer编写自定义预热逻辑,以确保在用户开始使用缓存/内存之前,您的数据段已完全读入缓存/内存
  • 声明它将返回true“如果pendingMerges或runningMerges中的任何合并都是优化合并”。它只会等待一秒钟,以避免出现某些通知可能无法触发的问题,这取决于调用方重新评估等待条件。我已链接到2.9。