Параллельное индексирование Lucene.NET. Мне нужно индивидуальное решение. Кто-нибудь может помочь? - PullRequest
0 голосов
/ 13 июля 2009

Я использую Lucene .NET

У меня есть 2 потока, каждый из которых выполняет индексацию разного контента (используя другой алгоритм, хотя они могут пытаться индексировать один и тот же документ). Они оба пишут в один и тот же индекс (используя один экземпляр IndexWriter).

Кроме того, у меня есть веб-приложение, которое также иногда требует записи в индекс. (очевидно, он не может использовать тот же экземпляр indexwriter)

Моя проблема в том, что веб-приложение не может выполнить запись в индекс, пока 2 потока выполняют свою операцию индексации, и они всегда есть !!

Как мне управлять этим более эффективно?

Спасибо

Ответы [ 2 ]

2 голосов
/ 13 июля 2009

Я не очень знаком с тем, как Lucene.NET поддерживает многопоточность, но на основании вашего описания вы можете создать «рабочую очередь», в которую другие потоки публикуют работу, и использовать один поток, чтобы забрать работу. из очереди и используйте IndexWriter, чтобы добавить его в индекс. Таким образом, ни одна нить не будет лишена возможности добавить свои изменения в индекс.

Я подозреваю, что Lucene в любом случае должен использовать внутренние блокировки для своих полнотекстовых индексов, поэтому наличие более одного потока, записывающего в индекс, вероятно, не эффективный способ масштабирования вашего кода.

Наконец, наличие нескольких потоков, пишущих в один изменяемый объект, часто является способом введения тонких и трудных для исправления проблем параллелизма в кодовую базу. Обычно я стараюсь избегать использования нескольких писателей - нескольких читателей, с другой стороны, это может быть весьма полезно.

1 голос
/ 13 июля 2009

Если вы не хотите использовать идею Л.Бушкина о рабочей очереди, другой подход заключается в использовании того же экземпляра IndexWriter в веб-приложении, что и фоновые потоки. Вы не объяснили, где находятся 2 потока индексации - если они находятся в том же процессе / домене приложения, что и веб-приложение, должно быть целесообразно использовать один и тот же экземпляр. Если нет, то вы должны использовать эквивалент рабочей очереди, упомянутой Л.Бушкиным, или ее адаптированную версию следующим образом: Добавьте третий поток в процесс индексирования, задачей которого является прослушивание запросов на индексирование из веб-приложения. Вы можете использовать, например, Именованные каналы для этого (особенно легко, если вы используете .NET 3.5). Веб-приложение отправляет запросы на индексирование в третий поток, который использует тот же IndexWriter, что и другие существующие потоки, для обновления индекса.

По сути, это та же идея, что и у Л.Бушкина (3-й поток является потребителем рабочей очереди), но может потребовать меньше усилий по разработке, поскольку вы могли бы делать меньше дополнительного кодирования.

Обновление: Именованные каналы можно использовать между процессами на разных машинах. Вам просто нужно знать о проблемах брандмауэра, которые могут возникнуть в определенных сетевых топологиях.

...