Я действительно озадачен, почему это продолжает умирать с 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)
Если посмотреть на трассировку стека, похоже, что вы выполняете поиск и сортировку по полю. Если вам нужно отсортировать по полю, внутренне Lucene необходимо загрузить все значения всех терминов в поле в память. Если в поле содержится много данных, очень вероятно, что у вас закончится память.
догадка, документы, которые вы индексируете, очень большие
Lucene по умолчанию индексирует только первые 10 000 терминов документа, чтобы избежать ошибок OutOfMemory, вы можете преодолеть это ограничение, см. setMaxFieldLength
. Кроме того, вы можете вызвать optimize () и закрыть, как только вы закончите обработку с помощью Indexwriter ()
. Определенный способ - профилировать и найти узкое место =]
Вы используете post.jar для индексации данных? Я думаю, в этой банке есть ошибка в solr1.2 / 1.3 (но я не знаю подробностей). Наша компания исправила это внутренне, и это также должно быть исправлено в последней версии trunk solr1.4 / 1.5.
Я не уверен, что существует надежный способ гарантировать, что вы не столкнетесь с OutOfMemoryExceptions с Lucene. Проблема, с которой вы столкнулись, связана с использованием FieldCache. Из API Lucene «Поддерживает кеши значений терминов». Если ваши условия превышают объем памяти, выделенной JVM, вы получите исключение.
Документы сортируются «в org.apache.lucene.search.FieldComparator $ StringOrdValComparator.setNextReader (FieldComparator.java:667)», что займет столько памяти, сколько необходимо для хранения сортируемых терминов для показатель.
Вам нужно будет просмотреть прогнозируемый размер полей, которые можно сортировать, и соответствующим образом настроить параметры JVM.