RavenDb Ver 3.0 - “查询失败”,大数据上带有“OutOfMemoryException”消息

时间:2016-06-13 15:25:44

标签: ravendb large-data

我们正在RavenDb Ver 3.0之上开发新的应用程序作为数据存储。

在性能测试中,我们发现系统存在问题。

问题在于,当我们运行如下所示的查询时,如果总结果超过某些结果(如> 2000文档或有时甚至更少),则取得所有结果

  

出现“查询失败”并显示“OutOfMemoryException”消息。

public ICollection<T> Find<T>(Expression<Func<T, bool>> predicate)
{
    var spendTime01 = Stopwatch.StartNew();
    var list = new List<T>();
    var power = 2000;

    RavenQueryStatistics statistics;
    using (DocumentSession)
    {
         list.AddRange(DocumentSession.Query<T>().Statistics(out statistics)
                                                 .Where(predicate).Take(power));
    }

    if (statistics.TotalResults > power)
    {
       var toTake = statistics.TotalResults - power;
       var taken = power;

       while (toTake > 0)
       {
            using (DocumentSession)
            {
               list.AddRange(
                   DocumentSession.Query<T>()
                       .Where(predicate)
                       .Skip(taken)
                       .Take(toTake > power ? power : toTake));
               toTake -= power;
               taken += power;
            }
       }
}

//using (DocumentSession)
//{
//    var query = DocumentSession.Query<T>("Activities/All").Where(predicate);
//    using (var enumerator = DocumentSession.Advanced.Stream(query))
//    {
//        while (enumerator.MoveNext())
//        {
//            list.Add(enumerator.Current.Document);
//        }
//    }
//}

spendTime01.Stop();
Debug.WriteLine($"Raven Find Predicate Elapsed Time: {spendTime01.Elapsed}");
return list;
}

我尝试使用索引并切换到Advanced.Stream(query),但此命令运行速度非常慢,4000文档需要20秒才能枚举结果并将其添加到列表中。

我阅读了所有博客,并在网上回答了这个问题,但我没有关于这个问题的任何POV,而且我完全担心如果总结果超过数十万会发生什么。< / p>

2 个答案:

答案 0 :(得分:1)

您可能以32位模式运行,并且需要以64位运行。

顺便说一下,你通过多次调用服务器来获取大量数据,明确地做了非常糟糕的事情。如果您需要那么多数据,请使用Streaming,但要注意在大多数情况下与大型记录集几乎没有关系

答案 1 :(得分:0)

要完成Mr.Ayende Rahien的回答,我应该提一下解决方案链接,将IIS Express更改为64位进程。

Why can't I set asp.net mvc 4 project to be x64