我們正在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,而且我完全擔心如果總結果超過成千上萬會發生什麼。
每個文件有多大?這相當於一個導致許多OutOfMemory異常的SELECT * ......你爲什麼需要查詢所有內容? –
@JensPettersson每個文件大約40kb。選擇全部的原因是提取取決於每個文檔成員的報告信息。 – iTachi