2016-06-13 46 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位運行。另一方面,你明確地做了非常糟糕的事情,並且通過多次調用服務器來獲取大量數據。如果您需要那麼多的數據,請使用流式處理,但請注意,在大多數情況下,與大型記錄集有很小的關係

相關問題