Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何确保Solr/Lucene获胜';你不会死在java.lang.OutOfMemoryError里吗?_Lucene_Jvm_Solr - Fatal编程技术网

如何确保Solr/Lucene获胜';你不会死在java.lang.OutOfMemoryError里吗?

如何确保Solr/Lucene获胜';你不会死在java.lang.OutOfMemoryError里吗?,lucene,jvm,solr,Lucene,Jvm,Solr,我真的很纳闷,为什么它在索引过程中总是因为java.lang.OutOfMemoryError而消亡,即使它有几GB的内存 它需要手动调整配置文件/jvm参数,而不是仅仅计算出可用的内存量并将其自身限制在这一范围内,这有什么根本原因吗?除了Solr,没有其他程序有过这种问题 是的,每次发生这样的崩溃时,我都可以不断调整JVM堆大小,但这一切都太落后了 以下是最新此类崩溃的堆栈跟踪,以防相关: SEVERE: java.lang.OutOfMemoryError: Java heap space

我真的很纳闷,为什么它在索引过程中总是因为java.lang.OutOfMemoryError而消亡,即使它有几GB的内存

它需要手动调整配置文件/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)
SEVERE:java.lang.OutOfMemoryError:java堆空间
位于java.util.Arrays.copyOfRange(Arrays.java:3209)
位于java.lang.String。(String.java:216)
位于org.apache.lucene.index.TermBuffer.toTerm(TermBuffer.java:122)
位于org.apache.lucene.index.SegmentTermEnum.term(SegmentTermEnum.java:169)
在org.apache.lucene.search.FieldCacheImpl$StringIndexCache.createValue(FieldCacheImpl.java:701)
位于org.apache.lucene.search.FieldCacheImpl$Cache.get(FieldCacheImpl.java:208)
位于org.apache.lucene.search.FieldCacheImpl.getStringIndex(FieldCacheImpl.java:676)
位于org.apache.lucene.search.FieldComparator$StringOrdValComparator.SetNextrader(FieldComparator.java:667)
位于org.apache.lucene.search.TopFieldCollector$OneComparatorNonScoringCollector.setnextrader(TopFieldCollector.java:94)
位于org.apache.lucene.search.indexsearch.search(indexsearch.java:245)
在org.apache.lucene.search.Searcher.search(Searcher.java:171)上
位于org.apache.solr.search.solrindexearcher.getDocListNC(solrindexearcher.java:988)
位于org.apache.solr.search.solrindexearcher.getDocListC(solrindexearcher.java:884)
位于org.apache.solr.search.solrindexearcher.search(solrindexearcher.java:341)
位于org.apache.solr.handler.component.QueryComponent.process(QueryComponent.java:182)
位于org.apache.solr.handler.component.SearchHandler.HandlerRequestBody(SearchHandler.java:195)
位于org.apache.solr.handler.RequestHandlerBase.HandlerRequest(RequestHandlerBase.java:131)
位于org.apache.solr.core.SolrCore.execute(SolrCore.java:1316)
位于org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:338)
位于org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:241)
位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
位于org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
位于org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
位于org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
位于org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
位于org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
位于org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
位于org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
位于org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
位于org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
运行(Thread.java:619)

查看堆栈跟踪,看起来您正在执行搜索,并按字段排序。如果需要按字段排序,Lucene内部需要将字段中所有术语的所有值加载到内存中。如果该字段包含大量数据,则很可能内存不足。

胡乱猜测,正在编制索引的文档非常大

Lucene默认情况下只为文档的前10000个术语编制索引,以避免OutOfMemory错误,您可以克服此限制,请参阅

此外,您可以调用optimize()并在使用Indexwriter()完成处理后立即关闭


一个明确的方法是分析并找到瓶颈=]

我不确定是否有可靠的方法确保您不会在Lucene中遇到OutOfMemoryException。您面临的问题与FieldCache的使用有关。Lucene API中的“维护术语值的缓存”。如果您的条件超过分配给JVM的内存量,您将得到异常

文档正在“org.apache.lucene.search.FieldComparator$StringOrdValComparator.setnextrader(FieldComparator.java:667)”上进行排序,这将占用存储为索引排序的术语所需的内存


您需要查看可排序字段的预计大小,并相应地调整JVM设置。

您正在使用post.jar索引数据吗?我认为这个jar在solr1.2/1.3中有一个bug(但我不知道细节)。我们公司已经在内部解决了这个问题,而且应该在最新的主干solr1.4/1.5中解决。

我使用的是以下Java:

$ java -version
java version "1.6.0"
OpenJDK  Runtime Environment (build 1.6.0-b09)
OpenJDK 64-Bit Server VM (build 1.6.0-b09, mixed mode)
$ java -version
java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02, mixed mode)
堆空间不足,但我升级到以下Java:

$ java -version
java version "1.6.0"
OpenJDK  Runtime Environment (build 1.6.0-b09)
OpenJDK 64-Bit Server VM (build 1.6.0-b09, mixed mode)
$ java -version
java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02, mixed mode)

现在,它在一个巨大的数据集上运行良好,有很多术语方面。

对我来说,它在重启Tomcat服务器后运行良好

  • 导航到C:\Bitnami\solr-4.7.2-0\apache solr\scripts
  • 打开serviceinstall.bat(使用记事本++或其他程序)
  • 添加或更新以下属性:-++JVM选项=-Xms1024M++JVM选项=-Xmx1024M
    • 在该窗口的命令提示符下,运行serviceinstall.bat REMOVE
    • 然后运行serviceinstall.bat安装
    • 希望能帮上忙

    • 这是一个老问题,但我无意中发现了:

    • 字符串字段缓存比Lucene 4.0要紧凑得多。所以很多人都能适应
    • 字段缓存是一种内存结构。所以不能阻止我
    • 对于需要排序或刻面的字段,应该尝试DocValues来解决这个问题。DOCD值