C# 计算NumFound时发生OutOfMemory异常

C# 计算NumFound时发生OutOfMemory异常,c#,out-of-memory,solr.net,C#,Out Of Memory,Solr.net,我已经在我们的项目中实现了Solr.net搜索,目前索引中有660k个文档(大小约185MB) 不幸的是,solr不时抛出OutOfMemory异常: 搜索联系人时出错System.OutOfMemoryException:的异常 已引发类型“System.OutOfMemoryException”。在 System.Text.StringBuilder.ToString()位于 System.IO.StreamReader.ReadToEnd()位于 SolrNet.Impl.SolrConn

我已经在我们的项目中实现了Solr.net搜索,目前索引中有660k个文档(大小约185MB)

不幸的是,solr不时抛出OutOfMemory异常:

搜索联系人时出错System.OutOfMemoryException:的异常 已引发类型“System.OutOfMemoryException”。在 System.Text.StringBuilder.ToString()位于 System.IO.StreamReader.ReadToEnd()位于 SolrNet.Impl.SolrConnection.ReadResponseToString(IHttpWebResponse c:\prg\SolrNet\SolrNet\Impl\SolrConnection.cs中的响应:第213行 在中的SolrNet.Impl.SolrConnection.GetResponse(IHttpWebRequest请求)处 c:\prg\SolrNet\SolrNet\Impl\SolrConnection.cs: SolrNet.Impl.SolrConnection.Get(字符串relativeUrl,IEnumerable'1 c:\prg\SolrNet\SolrNet\Impl\SolrConnection.cs中的参数:第149行 在SolrNet.Impl.SolrQueryExecuter的1.Execute(isolQuery q,QueryOptions c:\prg\SolrNet\SolrNet\Impl\SolrQueryExecuter.cs中的选项:第672行 在SolrNet.Impl.SolrBasicServer的1.Query(ISolrQuery查询,查询选项 c:\prg\SolrNet\SolrNet\Impl\SolrBasicServer.cs中的第98行 SolrNet.Impl.SolrServer的1.Query(ISolrQuery查询,查询选项 c:\prg\SolrNet\SolrNet\Impl\SolrServer.cs中的第49行 中的SolrNet.Impl.SolrServer`1.Query(ISolrQuery q) c:\prg\SolrNet\SolrNet\Impl\SolrServer.cs:at的第88行 SearchService.Search.SolrSearch.SearchCount(字符串queryString, 布尔搜索 c:\Projects\SearchService\Search\SolrSearch.cs:第240行

但代码非常简单:

public ISolrOperations<ContactForSearch> SolrInstance
{
    get
    {
        if (!_initialized)
        {
            Startup.Init<ContactForSearch>(ConfigurationManager.AppSettings.Get("SolrPath"));
            _initialized = true;
        }

        return ServiceLocator.Current.GetInstance<ISolrOperations<ContactForSearch>>();
    }
}

public virtual int SearchCount(string queryString, bool exactSearch)
{
    return SolrInstance.Query(GetGeneralSearchQuery(queryString, exactSearch)).NumFound;
}
公共隔离解决方案
{
得到
{
如果(!\u已初始化)
{
Init(ConfigurationManager.AppSettings.Get(“SolrPath”);
_初始化=真;
}
返回ServiceLocator.Current.GetInstance();
}
}
公共虚拟整数搜索计数(字符串查询字符串、布尔精确搜索)
{
返回SolrInstance.Query(GetGeneralSearchQuery(queryString,exactSearch)).NumFound;
}
可能有数千个联系人需要返回一些查询,但我认为
NumFound
应该只获取计数?那么,我如何解决这个问题呢?
提前感谢您的建议

看起来您正在使用.NET客户端。根据我的经验,当您使用.NET客户端执行Solr查询时,它将从Solr返回整个文档,而不仅仅是您感兴趣的查询部分。您可以尝试将查询限制为返回0个实际行,因为这仍应返回正确的NumFound值

例如:


问:您使用的是64位操作系统(Windows Server?),Solr运行的是64位JVM,您的Solr.Net应用程序的目标是64位CPU,对吗?我不知道Solr是如何工作的,但您不仅仅是在计数,而是在进行完整的查询和计数。您可能需要调整查询以直接获取计数。@paulsm4,是的,我在服务器2012 R2上,目标平台是混合的@JeffMercado,不确定-没有类似“count”或返回IEnumerable的查询。
Query
的结果是SolrQueryResults。再次,请确保后端Solr引擎(OS、Java JVM等)涉及的所有内容都是64位的,并且有足够的RAM。其他建议:1)安装并跟踪有问题的“SearchCount”HTTP请求,2)检查Solr服务器上的日志。@JleruOHeP是的,我一时想不起语法。希望它能解决你的问题
return SolrInstance.Query(query, new QueryOptions{ Rows = 0 }).NumFound;