Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NET并行索引。我需要一个定制的解决方案。有人能帮忙吗?_C#_Indexing_Lucene.net_Parallel Processing - Fatal编程技术网

C# NET并行索引。我需要一个定制的解决方案。有人能帮忙吗?

C# NET并行索引。我需要一个定制的解决方案。有人能帮忙吗?,c#,indexing,lucene.net,parallel-processing,C#,Indexing,Lucene.net,Parallel Processing,我正在使用Lucene.NET 我有两个线程,每个线程对一些不同的内容进行索引(使用不同的算法,尽管它们可能尝试对同一文档进行索引)。它们都在写入同一个索引(使用单个IndexWriter实例) 此外,我还有一个web应用程序,它也需要偶尔写入索引。(它显然不能使用相同的indexwriter实例) 我的问题是,当两个线程正在运行索引操作时,web应用程序无法写入索引,而且总是这样 我如何更有效地管理这一点 感谢我不太熟悉Lucene.NET如何支持线程,但根据您的描述,您可能希望创建一个“工作

我正在使用Lucene.NET

我有两个线程,每个线程对一些不同的内容进行索引(使用不同的算法,尽管它们可能尝试对同一文档进行索引)。它们都在写入同一个索引(使用单个IndexWriter实例)

此外,我还有一个web应用程序,它也需要偶尔写入索引。(它显然不能使用相同的indexwriter实例)

我的问题是,当两个线程正在运行索引操作时,web应用程序无法写入索引,而且总是这样

我如何更有效地管理这一点


感谢

我不太熟悉Lucene.NET如何支持线程,但根据您的描述,您可能希望创建一个“工作队列”,其他线程将工作发布到该队列,并使用单个线程从队列中提取工作,并使用IndexWriter将其添加到索引中。这样,任何一个线程都不会因为将其更改添加到索引中而感到饥饿

我怀疑Lucene必须在其全文索引上使用内部锁,因此让多个线程写入索引可能不是扩展代码的有效方法


最后,让多个线程写入单个可变对象通常是在代码库中引入微妙且难以修复的并发问题的一种方式。我通常会尽量避免使用多个编写器-另一方面,多个读卡器可能非常有用。

我不太熟悉Lucene.NET如何支持线程,但根据您的描述,您可能希望创建一个“工作队列”其他线程将工作发布到-并使用单个线程从队列中提取工作,并使用IndexWriter将其添加到索引中。这样,任何一个线程都不会因为将其更改添加到索引中而感到饥饿

我怀疑Lucene必须在其全文索引上使用内部锁,因此让多个线程写入索引可能不是扩展代码的有效方法


最后,让多个线程写入单个可变对象通常是在代码库中引入微妙且难以修复的并发问题的一种方式。我通常会尽量避免使用多个writer-另一方面,多个reader可能非常有用。

如果您不想使用LBushkin的工作队列思想,另一种方法是在web应用程序中使用与后台线程使用的相同的
IndexWriter
实例。您没有解释这两个索引线程的位置-如果它们与web应用程序位于同一进程/应用程序域中,那么使用同一实例应该是可行的。如果没有,那么您必须使用LBushkin提到的等效工作队列,或者如下所示的工作队列的修改版本:向索引进程添加第三个线程,其任务是侦听来自web应用程序的索引请求。您可以为此使用命名管道(如果您使用的是.NET 3.5,则特别容易)。web应用程序向第三个线程发送索引请求,该线程使用与其他现有线程相同的
IndexWriter
来更新索引

这基本上与LBushkin的想法相同(第三个线程是工作队列使用者),但可能涉及较少的开发工作,因为您可以进行较少的额外编码


更新:命名管道可在不同计算机上的进程之间使用。您只需要注意某些网络拓扑中可能出现的防火墙问题。

如果您不想使用LBushkin的工作队列思想,另一种方法是在web应用程序中使用与后台线程使用的相同的
IndexWriter
实例。您没有解释这两个索引线程的位置-如果它们与web应用程序位于同一进程/应用程序域中,那么使用同一实例应该是可行的。如果没有,那么您必须使用LBushkin提到的等效工作队列,或者如下所示的工作队列的修改版本:向索引进程添加第三个线程,其任务是侦听来自web应用程序的索引请求。您可以为此使用命名管道(如果您使用的是.NET 3.5,则特别容易)。web应用程序向第三个线程发送索引请求,该线程使用与其他现有线程相同的
IndexWriter
来更新索引

这基本上与LBushkin的想法相同(第三个线程是工作队列使用者),但可能涉及较少的开发工作,因为您可以进行较少的额外编码


更新:命名管道可在不同计算机上的进程之间使用。您只需要注意某些网络拓扑中可能出现的防火墙问题。

多个线程可以使用同一个IndexWriter实例写入同一索引,这甚至在代码本身中有记录。我的问题是如何处理将不同的IndexWriter实例写入同一目录的问题。您能否在问题中提供有关如何使用IndexWriter的更多详细信息?您的问题中不清楚线程争用的确切位置。没有线程争用。我对前两个线程使用一个indexWriter,我的web应用程序需要写入同一个索引,这是不可能的,因为这两个线程总是在索引。@Roey,如果是这样的话,那么也许LBushkin给了你正确的建议。如果有一个线程处理所有写入索引的请求,那么可以有任意数量的并发线程写入索引。多个线程可以使用同一个IndexWriter实例写入同一个索引,这甚至在代码本身中有记录。我的问题是如何处理将不同的IndexWriter实例写入同一目录的问题。您能否在问题中提供有关如何使用IndexWriter的更多详细信息?你的观点不清楚