我们正在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