Android Lucene OutOmMeoryExceptoin
У меня есть индекс Lucene с 50571 документом из 1740 книг. У меня есть два процесса, которые создают этот индекс. Первый процесс заключается в создании индекса документа устройства по документу. Этот процесс очень медленный. Другой процесс - создать на сервере индекс книг (точно так же, как я создаю его на устройстве), загрузить и объединить его с главным индексом. Этот намного быстрее для создания главного индекса. Создание индекса работает в любом случае.
Проблема в том, что при поиске по индексу загрузки-слияния я получаю OutOfMemoryException
, но при поиске по индексу, созданному на устройстве, я не получаю эту ошибку. Я прошел и создал индексную книгу за книгой (download-merge) и искал после того, как каждая книга была проиндексирована; основываясь на этом, и когда я добираюсь до книги ~450, я начинаю получать OutOfMemoryException
,
Что заставляет меня исчерпать память.
1 ответ
Lucene - это боров памяти. При записи "объединяющих" индексов вместе он сохраняет весь набор индексов в памяти дважды. Как указано в документации Lucene.
Обратите внимание, что для этого требуется временное свободное пространство в Справочнике, в 2 раза превышающее сумму всех входных индексов (включая начальный индекс). Если читатели / поисковики открыты относительно начального индекса, то требуемое временное свободное пространство будет больше на размер начального индекса
Это много памяти. Чтобы смягчить это, мы должны уменьшить размер индекса, вызвав forceMerge(int)
на индекс писателя. Это медленный процесс, но он уменьшает размер индекса. Я называю это аргументом 1
каждый раз, когда в каталоге индекса находится 50 или более файлов.