RavenDb Ver 3.0 - "Query Failed" 和 "OutOfMemoryException" 关于大数据的消息
RavenDb Ver 3.0 - "Query Failed" with "OutOfMemoryException" Message on Large data
我们正在 RavenDb Ver 3.0 之上开发新的应用程序作为数据存储。
在性能测试中,我们发现系统存在问题。
问题是,当我们 运行 像下面这样的查询时,要获取所有结果,如果总结果超过某某(例如 >2000 个文档,有时甚至更少)
the "Query Failed" with "OutOfMemoryException" Message appears.
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 秒来枚举结果并将其添加到列表中。
我阅读了所有博客并在网上回答了这个问题,但我对这个问题没有任何看法,而且我完全担心如果总结果超过数十万会发生什么.
您很可能 运行 在 32 位模式下,您需要 运行 在 64 位模式下。
顺便说一句,您通过多次调用服务器来获取大量数据显然是在做非常糟糕的事情。如果您需要那么多数据,请使用 Streaming,但请注意,在大多数情况下,大型记录集几乎没有什么用处
要完成 Mr.Ayende Rahien 的回答,我应该提到将 IIS Express 更改为 运行 作为 64 位进程的解决方案 link。
Why can't I set asp.net mvc 4 project to be x64
我们正在 RavenDb Ver 3.0 之上开发新的应用程序作为数据存储。
在性能测试中,我们发现系统存在问题。
问题是,当我们 运行 像下面这样的查询时,要获取所有结果,如果总结果超过某某(例如 >2000 个文档,有时甚至更少)
the "Query Failed" with "OutOfMemoryException" Message appears.
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 秒来枚举结果并将其添加到列表中。
我阅读了所有博客并在网上回答了这个问题,但我对这个问题没有任何看法,而且我完全担心如果总结果超过数十万会发生什么.
您很可能 运行 在 32 位模式下,您需要 运行 在 64 位模式下。
顺便说一句,您通过多次调用服务器来获取大量数据显然是在做非常糟糕的事情。如果您需要那么多数据,请使用 Streaming,但请注意,在大多数情况下,大型记录集几乎没有什么用处
要完成 Mr.Ayende Rahien 的回答,我应该提到将 IIS Express 更改为 运行 作为 64 位进程的解决方案 link。
Why can't I set asp.net mvc 4 project to be x64