Как удостовериться, что Solr/Lucene не умрет с java.lang. OutOfMemoryError?

Я действительно озадачен, почему это продолжает умирать с java.lang. OutOfMemoryError во время индексации даже при том, что это имеет несколько ГБ памяти.

Существует ли фундаментальная причина, почему ей нужна ручная тонкая настройка файлов конфигурации / jvm параметры вместо него просто выясняющий, сколько памяти доступно и ограничивает самой этим? Никакие другие программы кроме Solr никогда не имеют этот вид проблемы.

Да, я могу продолжать настраивать размер "кучи" JVM каждый раз, когда такие катастрофические отказы происходят, но это - все так назад.

Вот является отслеживание стека последнего таким катастрофическим отказом в случае, если это релевантно:

SEVERE: java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOfRange(Arrays.java:3209)
    at java.lang.String.<init>(String.java:216)
    at org.apache.lucene.index.TermBuffer.toTerm(TermBuffer.java:122)
    at org.apache.lucene.index.SegmentTermEnum.term(SegmentTermEnum.java:169)
    at org.apache.lucene.search.FieldCacheImpl$StringIndexCache.createValue(FieldCacheImpl.java:701)
    at org.apache.lucene.search.FieldCacheImpl$Cache.get(FieldCacheImpl.java:208)
    at org.apache.lucene.search.FieldCacheImpl.getStringIndex(FieldCacheImpl.java:676)
    at org.apache.lucene.search.FieldComparator$StringOrdValComparator.setNextReader(FieldComparator.java:667)
    at org.apache.lucene.search.TopFieldCollector$OneComparatorNonScoringCollector.setNextReader(TopFieldCollector.java:94)
    at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:245)
    at org.apache.lucene.search.Searcher.search(Searcher.java:171)
    at org.apache.solr.search.SolrIndexSearcher.getDocListNC(SolrIndexSearcher.java:988)
    at org.apache.solr.search.SolrIndexSearcher.getDocListC(SolrIndexSearcher.java:884)
    at org.apache.solr.search.SolrIndexSearcher.search(SolrIndexSearcher.java:341)
    at org.apache.solr.handler.component.QueryComponent.process(QueryComponent.java:182)
    at org.apache.solr.handler.component.SearchHandler.handleRequestBody(SearchHandler.java:195)
    at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:131)
    at org.apache.solr.core.SolrCore.execute(SolrCore.java:1316)
    at org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:338)
    at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Thread.java:619)
15
задан taw 6 March 2010 в 07:43
поделиться

4 ответа

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

3
ответ дан 1 December 2019 в 05:19
поделиться

догадка, документы, которые вы индексируете, очень большие

Lucene по умолчанию индексирует только первые 10 000 терминов документа, чтобы избежать ошибок OutOfMemory, вы можете преодолеть это ограничение, см. setMaxFieldLength

. Кроме того, вы можете вызвать optimize () и закрыть, как только вы закончите обработку с помощью Indexwriter ()

. Определенный способ - профилировать и найти узкое место =]

0
ответ дан 1 December 2019 в 05:19
поделиться

Вы используете post.jar для индексации данных? Я думаю, в этой банке есть ошибка в solr1.2 / 1.3 (но я не знаю подробностей). Наша компания исправила это внутренне, и это также должно быть исправлено в последней версии trunk solr1.4 / 1.5.

0
ответ дан 1 December 2019 в 05:19
поделиться

Я не уверен, что существует надежный способ гарантировать, что вы не столкнетесь с OutOfMemoryExceptions с Lucene. Проблема, с которой вы столкнулись, связана с использованием FieldCache. Из API Lucene «Поддерживает кеши значений терминов». Если ваши условия превышают объем памяти, выделенной JVM, вы получите исключение.

Документы сортируются «в org.apache.lucene.search.FieldComparator $ StringOrdValComparator.setNextReader (FieldComparator.java:667)», что займет столько памяти, сколько необходимо для хранения сортируемых терминов для показатель.

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

2
ответ дан 1 December 2019 в 05:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: