Индексирование люкена с параллельными расширениями

StackOverflow https://stackoverflow.com/questions/3893601

Вопрос

Я хотел бы ускорить индексацию 10 ГБ данных в индекс Lucene. Будет хорошим способом сделать это? Если бы мне нужно разделить данные в куски, а затем у каждого потока начинают индексацию кусков?

Чтобы сохранить отзывчивый пользовательский интерфейс, был бы лучшим подходом, или что -то еще?

Solr уже делает что -то подобное? Или все еще стоит кодировать это сам.

Это было полезно?

Решение

Если вы хотите несколько потоков, чтобы написать одному индексирую, то я бы просто породил один поток, который делает что-то вроде

Parallel.ForEach(docs, d => { writer.Add(d,analyzer) });

Так что .NET имеет дело с разделением данных.

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

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

Как правило, если вы спросите: «Должен ли я использовать Solr или сделать это сам?» Ответ почти всегда «использовать Solr». Я не могу подумать по какой-либо причине, по которой вы хотели бы сделать его здесь, если только ваш JVM не очень плохо, или вы действительно ненавидите Java.

Другие советы

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

Луси IndexWriter Обрабатывает параллелизм, поэтому вам не нужно беспокоиться об этом. Ваши темы могут просто позвонить indexWriter.addDocument всякий раз, когда они готовы сделать это.

В одном проекте документы были получены из выбранного оператора из базы данных. Я создал n потоков, и каждый взял следующий документ из ResultSet и добавил его в индекс. Нить вышла, когда больше не было рядов, и главная нить ждала на CountDownLatch.

Второй проект был немного сложнее. Система была «ползанием» набором документов, т. Е. Не было ясно с самого начала, сколько там будет быть документов. Поэтому нужно было сохранить «очередь» документов, которые уже были обнаружены. И в процессе анализа и индексации этих документов можно было обнаружить больше документов, которые затем были также добавлены в очередь. Очередь была заполнена в начале с начальным / семенным документом. Я создал класс Autostopthreadpool Чтобы управлять темами, вы можете скачать это, если хотите. (Пул потоков JVM вам нужно «добавить» все задачи, затем «подождите завершения», что не подходило, поскольку обработка задачи может привести к обнаружению новых задач)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top