Solr - 执行spellcheck.build时耗尽堆内存

时间:2014-12-23 11:16:28

标签: solr solr4

我使用solr和tomcat作为servlet。我设置solr只使用一个核心,并定义了一个DIH来从mysql表中逐行导入文档。 一切都很好,工作得很好。文档被正确编入索引,我可以在' em中搜索。

问题在于我尝试使用建议模块,但是我第一次使用这样的网址构建需要构建的问题:

http://user:pass@localhost:port/solr/corename/suggest?q=whatever&spellcheck.build=true

我遗漏了一条重要的信息:目前导入的数据是470万条记录。

首先,它无法为100万个文档构建拼写检查字典(如果这就是它所构建的),因为jvm将耗尽堆内存,并显示以下消息:

java.lang.OutOfMemoryError: GC overhead limit exceededjava.lang.RuntimeException:
java.lang.OutOfMemoryError: GC overhead limit exceeded at
org.apache.solr.servlet.SolrDispatchFilter.sendError(SolrDispatchFilter.java:793) at
org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:434) at 
org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:207) at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at 

所以我逐渐增加堆内存,现在它大约2GB,我认为这很多。

当然,显而易见的解决办法是再次增加java的堆内存,但如果有任何方法可以划分和征服字典构建过程,我会徘徊吗? 或任何其他解决方案。

非常感谢

2 个答案:

答案 0 :(得分:0)

1)对拼写检查索引大小有很大影响的参数是“thresholdTokenFrequency”。将以下参数添加到SpellCheckComponent配置可能是一种补救措施:

<float name="thresholdTokenFrequency">.01</float>

2)如果拼写检查字段中的数据是从不同的其他字段复制的,您可以尝试设置不同的SpellCheckComponents,每个字段在单独的字段上运行。

没试过这个,我担心合并不同的SpellCheckComponents的结果可能会非常棘手。

答案 1 :(得分:0)

Solr在构建索引时需要大量内存,例如拼写检查 - 索引。

因为这不是为机器增加更多内存的方法。

我遇到了同样的问题并且发现,增加虚拟内存将解决问题。 您可以使用ulimit -v来显示虚拟内存的当前状态。 在我的情况下,对于5GByte索引是14GByte,哪个战争不够(10Million docs)

所以我把ulimit -v unlimited放在tomcat启动脚本的开头。这解决了我的问题。