[Lucene] Каковы накладные расходы в IndexReader / Searcher

#performance #lucene

#Производительность #lucene

Вопрос:

Большая часть документации Lucene рекомендует сохранить один экземпляр IndexReader и повторно использовать его из-за накладных расходов на открытие нового средства чтения.

Однако мне трудно понять, на чем основаны эти накладные расходы и что на это влияет.

с этим связано то, сколько накладных расходов на самом деле вызывает открытый IndexReader?

Контекст для этого вопроса таков: в настоящее время мы запускаем кластеризованный стек tomcat, где мы выполняем полный текст из ServletContainer. Эти поиски выполняются по отдельным индексам Lucene для каждого клиента, потому что каждый клиент ищет только свои собственные данные. Каждый из этих индексов содержит от нескольких тысяч до (в настоящее время) около 100 000 документов.

Из-за кластеризованных узлов tomcat любой клиент может подключаться к любому узлу tomcat. Поэтому сохранение IndexReader открытым фактически означало бы сохранение нескольких тысяч IndexReaders открытыми на каждом узле tomcat. Это кажется плохой идеей, однако постоянное повторное открытие тоже не кажется очень хорошей идеей.

Хотя я могу несколько изменить способ развертывания Lucene, если он не нужен, я бы предпочел этого не делать.

Ответ №1:

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

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

Вы правы, что наличие тысяч индексов не является обычной практикой. Стандартный совет заключается в том, чтобы они совместно использовали индекс и использовали фильтры, чтобы гарантировать, что будут возвращены соответствующие результаты.

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

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