Lucene IndexWriter безопасность потоков - PullRequest
10 голосов
/ 05 мая 2011

Lucene поощряет повторное использование IndexWriter из нескольких потоков.

Учитывая, что два потока могут иметь ссылку на IndexWriter, если поток A вызывает закрывающее устройство записи, поток B останется с бесполезным средством записи. Но, насколько я понимаю, lucene почему-то знает, что другой поток использует того же автора и откладывает его закрытие.

Это действительно так? Как lucene отслеживает, что другой поток использует писателя?

EDIT Судя по ответам, закрывать IndexWriter некорректно. Но это создает новую проблему: если кто-то держит IndexWriter открытым, то по существу блокирует доступ к этому индексу из другой JVM (например, в случае кластера или общего индекса между многими приложениями).

Ответы [ 3 ]

6 голосов
/ 12 мая 2011

Если один поток закрывает IndexWriter, в то время как другие потоки все еще используют его, вы получите непредсказуемые результаты. Мы пытаемся, чтобы другие потоки обращались к AlreadyClosedException, но это всего лишь лучшее усилие (не гарантированное). Например, вы также можете легко вызвать NullPointerException. Поэтому вы должны выполнить внешнюю синхронизацию, чтобы убедиться, что вы этого не делаете.

Недавно (только в магистрали Lucene прямо сейчас, в конечном итоге до 4.0) было исправлено узкое место с большими потоками внутри IndexWriter, что позволяло сбрасывать сегменты одновременно (ранее они были однопоточными). В приложениях, работающих с несколькими потоками индексации на параллельном оборудовании, это может значительно повысить пропускную способность индексации. Подробнее см. http://blog.mikemccandless.com/2011/05/265-indexing-speedup-with-lucenes.html.

1 голос
/ 05 мая 2011

Потокобезопасность и повторное использование IndexWriter означает, что у вас может быть несколько потоков, использующих этот экземпляр для создания / обновления / удаления документов. Если вы закроете indexwriter в одном потоке, он действительно испортит все остальные.

0 голосов
/ 05 мая 2011

Вы имеете в виду флаг waitForMerges в методе IndexWriter.close()?

Закрывает индекс с ожиданием завершения текущих слияний или без него. Это имеет смысл только при использовании MergeScheduler, который выполняет слияния в фоновых потоках.

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

При закрытии модуля записи вы должны позволить ему завершить процесс консолидации, в противном случае:

опасно всегда вызывать close (false), особенно когда IndexWriter не открывается слишком долго, потому что это может привести к «истощению при слиянии», в результате чего у длинных слияний никогда не будет возможности завершиться. Это приведет к тому, что со временем в вашем индексе будет слишком много сегментов.

Так что автор не «знает» о ваших темах в том смысле, в котором вы имели в виду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...