这与这个问题基本相同,但没有有用的答案,情况略有不同:
我们在Windows 2008 R2上使用JDK版本1.8.0_77-b03运行SOLR 5.5.0。运行索引过程时,运行SOLR的java进程有一个私有工作集,最终使用该框中的所有8 GB内存。
我们使用我们使用SOLRJ客户端编写的Spring Batch Starter流程索引3M +文档。这是索引我们收集的文档的代码:
log.info("Adding " + docList.size() + " documents to Solr index");
if(docList.size() == 0) {
log.warn("Was asked to index 0 records, but input size was " + items.size());
} else {
log.debug("Splitting list of size " + docList.size() + " into manageable chunks of " + batchCommitSize);
List<List<SolrInputDocument>> partitionedList = Lists.partition(docList, batchCommitSize);
SolrClient solrClient = (SolrClient) applicationContext.getBean("solrClient");
for (List<SolrInputDocument> chewableChunk : partitionedList) {
solrClient.add(chewableChunk);
solrClient.commit();
log.info(chewableChunk.size() + " documents committed.");
}
log.info("Finished batch indexing of " + docList.size() + " documents.");
}
SOLRJ客户端的Spring配置:
@Value("${code.search.num.solr.threads}")
private int numSolrThreads;
@Bean(destroyMethod = "close")
public ConcurrentUpdateSolrClient solrClient() {
return new ConcurrentUpdateSolrClient(solrHost, 100, numSolrThreads);
}
//code.search.num.solr.threads=25
这是我们的架构定义。它真的很长,所以我只是用我们的字段定义来剪切和粘贴该部分。如有必要,我可以上传更多。其中大部分都是从教程中的示例配置中复制的。
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="_version_" type="long" indexed="true" stored="true"/>
<field name="_root_" type="string" indexed="true" stored="false"/>
<field name="_text_" type="text_general" indexed="true" stored="false" multiValued="true"/>
<copyField source="*" dest="_text_"/>
<field name="fileName" type="string" indexed="true" stored="true" required="true"/>
<field name="projectName" type="string" indexed="true" stored="true" required="true"/>
<field name="lastCommitAuthor" type="string" indexed="true" stored="true"/>
<field name="vcsUrl" type="string" indexed="true" stored="true"/>
<field name="teamCityUrl" type="string" indexed="true" stored="true"/>
<field name="jenkinsUrl" type="string" indexed="true" stored="true"/>
<field name="content" type="text_general" indexed="true" stored="true" required="true"/>
<field name="relativePath" type="string" indexed="true" stored="true" required="true"/>
<!-- Field to use to determine and enforce document uniqueness.
Unless this field is marked with required="false", it will be a required field
-->
<uniqueKey>id</uniqueKey>
上一个问题表明内存映射文件可能是罪魁祸首,但我们一直无法找到解决方法。我们还尝试在每次提交时关闭并重新创建客户端,
有没有什么办法可以减少索引时SOLR使用的内存量?
答案 0 :(得分:2)
我知道如何关闭mmapcache
。在solrConfig.xml
中搜索directoryFactory
并使用下面给出的替换现有标记。
这将关闭Mmapped文件:
<directoryFactory name="DirectoryFactory"
class="${solr.directoryFactory:solr.SimpleFSDirectoryFactory.}"/>
由于此更改,您将无法接近实时搜索。