2016-06-13 62 views
0

我们正在RavenDb Ver 3.0之上开发新的应用程序作为数据存储。RavenDb Ver 3.0 - 在大数据上出现“OutOfMemoryException”消息时出现“查询失败”

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

的问题是,当我们运行一个查询类似下面,把所有的结果,如果总的结果变得比某物更多的(如> 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,而且我完全担心如果总结果超过成千上万会发生什么。

+0

每个文件有多大?这相当于一个导致许多OutOfMemory异常的SELECT * ......你为什么需要查询所有内容? –

+0

@JensPettersson每个文件大约40kb。选择全部的原因是提取取决于每个文档成员的报告信息。 – iTachi

回答

1

您很可能以32位模式运行,并且您需要以64位运行。另一方面,你明确地做了非常糟糕的事情,并且通过多次调用服务器来获取大量数据。如果您需要那么多的数据,请使用流式处理,但请注意,在大多数情况下,与大型记录集有很小的关系