Управление жизненным циклом Lucene.NET - PullRequest
4 голосов
/ 20 апреля 2011

Давайте предположим, что у меня есть базовые знания по добавлению и поиску документов.

Каков наилучший способ управления экземплярами IndexWriter и IndexReader?

В настоящее время мое приложение создает одноэлементный экземпляр IndexWriter. Когда мне нужно выполнить поиск, я просто создаю IndexSearcher из IndexWriter, используя следующую команду

var searcher = new IndexSearcher(writer.GetReader())

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

Эта текущая реализация считается идеальной? Эта реализация решила проблему с памятью, но есть проблема с постоянно существующим файлом write.lock (потому что IndexWriter всегда создается и открывается). Вот трассировка стека ошибок, которые я получаю в приложении.

Время ожидания блокировки: NativeFSLock @ C: \ Inetpub \ Wwwroot \ htdocs_beta \ App_Data \ продукты3 \ write.lock: System.IO.IOException: процесс не может получить доступ к файлу 'C: \ Inetpub \ Wwwroot \ htdocs_beta \ App_Data \ продукты3 \ write.lock' потому что он используется другим процесс. в System.IO .__ Error.WinIOError (Int32 errorCode, String MaybeFullPath) в System.IO.FileStream.Init (Строковый путь, Режим FileMode, доступ к FileAccess, Права Int32, логические права использования, Общий доступ к FileShare, размер буфера Int32, Опции FileOptions, SECURITY_ATTRIBUTES secAttrs, String msgPath, логическое значение bFromProxy, логическое значение useLongPath) в System.IO.FileStream..ctor (String путь, режим FileMode, FileAccess доступ) в Lucene.Net.Store.NativeFSLock.Obtain ()

Я думаю, может быть, было бы лучше создать одноэлементный экземпляр IndexSearcher для поиска, а затем создать IndexWriter по мере необходимости в памяти. Таким образом, файл write.lock будет создан / удален при обновлении индекса. Единственная проблема, с которой я сталкиваюсь, заключается в том, что экземпляр IndexSearcher устареет, и мне нужно будет запустить задачу, которая перезагрузит IndexSearcher, если индекс был обновлен.

Что вы думаете?

Как вы справляетесь с большим индексом при оперативном обновлении?

1 Ответ

1 голос
/ 20 апреля 2011

Вы должны использовать только одну программу записи индекса, чтобы избежать проблем с блокировкой. Посмотрите: Синхронизация записи / чтения Lucene.Net

...