【问题标题】:OutOfMemory exception when evaluating NumFound评估 NumFound 时出现 OutOfMemory 异常
【发布时间】:2016-01-08 07:08:30
【问题描述】:

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

不幸的是,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:line 213 在 SolrNet.Impl.SolrConnection.GetResponse(IHttpWebRequest request) 中 c:\prg\SolrNet\SolrNet\Impl\SolrConnection.cs:第 199 行 SolrNet.Impl.SolrConnection.Get(字符串 relativeUrl,IEnumerable'1 参数)在 c:\prg\SolrNet\SolrNet\Impl\SolrConnection.cs:line 149 在 SolrNet.Impl.SolrQueryExecuter'1.Execute(ISolrQuery q, QueryOptions 选项)在 c:\prg\SolrNet\SolrNet\Impl\SolrQueryExecuter.cs:line 672 在 SolrNet.Impl.SolrBasicServer'1.Query(ISolrQuery 查询,QueryOptions 选项)在 c:\prg\SolrNet\SolrNet\Impl\SolrBasicServer.cs:line 98 at SolrNet.Impl.SolrServer'1.Query(IsolrQuery 查询,QueryOptions 选项)在 c:\prg\SolrNet\SolrNet\Impl\SolrServer.cs:line 49 at SolrNet.Impl.SolrServer`1.Query(IsolrQuery q) 在 c:\prg\SolrNet\SolrNet\Impl\SolrServer.cs:第 88 行 SearchService.Search.SolrSearch.SearchCount(字符串查询字符串, 布尔精确搜索)在 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;
}

有可能有成千上万的联系人要返回一些查询,但我认为NumFound 应该只是得到计数?那么,我该如何解决这个问题呢? 提前感谢所有建议!

【问题讨论】:

  • 问:您使用的是 64 位操作系统(Windows Server?),Solr 运行的是 64 位 JVM,并且您已将 Solr.Net 应用程序定位为 64 位 CPU ,对吗?
  • 我不知道 solr 是如何工作的,但你不只是得到一个计数,你正在做完整的查询并计算它。您可能需要调整查询以直接获取计数。
  • @paulsm4,是的,我在 Server 2012 R2 上,目标平台是混合的 @JeffMercado,不确定 - 没有像“Count”这样的查询或返回 IEnumerable 的东西。 Query 的结果是 SolrQueryResult
  • 再次确认,与您的后端 Solr 引擎(操作系统、Java JVM 等)相关的一切都是 64 位的,并且有足够的 RAM。其他建议:1) 安装 Fiddler 并跟踪有问题的“SearchCount”HTTP 请求,2) 检查 Solr 服务器上的日志。

标签: c# out-of-memory solr.net


【解决方案1】:

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

例如:

return SolrInstance.Query(query, new QueryOptions{ Rows = 0 }).NumFound;

【讨论】:

  • @JleruOHeP 是的,我不记得我脑海中的语法了。希望它解决了你的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-12
相关资源
最近更新 更多