gpt4 book ai didi

java - 如何避免 Apache Solr 中的 Java OutOfMemoryMemory Java 堆空间

转载 作者:行者123 更新时间:2023-11-29 04:57:44 25 4
gpt4 key购买 nike

我是 Java 世界的新手,最近才开始使用 Solr。我在 Amazon t2.small box 上运行 Solr 5.2.1,它是单核和 2 gm RAM ubuntu 服务器。我使用 1gb 堆空间配置运行 Solr。 Solr 核心目前有 800 万个文档,其中包含 15 个字段,其中 14 个仅为字符串 ID。另一个是 DateRange 字段类型。

搜索查询通常很长,通常在 15000-20000 个字符的范围内。这是由于过滤器查询与 100 秒范围内的多个字段值一起使用。例如,

/select?fq=field1:("value-1"+OR+"value-2"+.......+OR+"value-n") , n ranges from 1000-2000

我将 Jetty 的 MaxURLLength 修改为 65535,这让我可以这样做。

早期在文档数<2M的时候,Solr运行很流畅。但是,当文档数量达到 8M 时,Solr 开始崩溃并给出 OutOfMemoryError 堆空间错误。以下是异常(exception)情况

java.lang.OutOfMemoryError: Java heap space
at org.apache.lucene.util.FixedBitSet.<init>(FixedBitSet.java:115)
at org.apache.lucene.spatial.prefix.IntersectsPrefixTreeFilter$1.start(IntersectsPrefixTreeFilter.java:62)
at org.apache.lucene.spatial.prefix.AbstractVisitingPrefixTreeFilter$VisitorTemplate.getDocIdSet(AbstractVisitingPrefixTreeFilter.java:130)
at org.apache.lucene.spatial.prefix.IntersectsPrefixTreeFilter.getDocIdSet(IntersectsPrefixTreeFilter.java:57)
at org.apache.lucene.search.Filter$1.scorer(Filter.java:95)
at org.apache.lucene.search.Weight.bulkScorer(Weight.java:137)
at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:768)
at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:485)
at org.apache.solr.search.SolrIndexSearcher.getDocSetNC(SolrIndexSearcher.java:1243)
at org.apache.solr.search.SolrIndexSearcher.getPositiveDocSet(SolrIndexSearcher.java:926)
at org.apache.solr.search.SolrIndexSearcher.getProcessedFilter(SolrIndexSearcher.java:1088)
at org.apache.solr.search.SolrIndexSearcher.getDocListNC(SolrIndexSearcher.java:1609)
at org.apache.solr.search.SolrIndexSearcher.getDocListC(SolrIndexSearcher.java:1485)
at org.apache.solr.search.SolrIndexSearcher.search(SolrIndexSearcher.java:561)
at org.apache.solr.handler.component.QueryComponent.process(QueryComponent.java:518)
at org.apache.solr.handler.component.SearchHandler.handleRequestBody(SearchHandler.java:255)
at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:143)
at org.apache.solr.core.SolrCore.execute(SolrCore.java:2064)
at org.apache.solr.servlet.HttpSolrCall.execute(HttpSolrCall.java:654)
at org.apache.solr.servlet.HttpSolrCall.call(HttpSolrCall.java:450)
at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:227)
at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:196)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
  1. 上述异常是不是内存不足?
  2. 是否是因为查询太长进而影响了搜索?

最佳答案

这可能是由于过滤器的数量:每个过滤器对索引中的每个文档使用 1 位。对于 8M 文档,每个过滤器使用 1MB。

如果您的 solrconfig.xml 中的 filterCache 部分来自示例,则其大小为 512。这意味着随着时间的推移,它将包含 512*1MB 的索引数据。对于 1GB 的堆,它会耗尽内存听起来很合理。

简单的解决方案是减少过滤器缓存中的条目数量。这可能会对您的搜索速度产生负面影响,或者它可能根本不会影响它,如果您的过滤器在调用之间是唯一的。您将必须对其进行测试。

参见 https://wiki.apache.org/solr/SolrCaching#filterCache

关于java - 如何避免 Apache Solr 中的 Java OutOfMemoryMemory Java 堆空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33149387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com