我们正在RavenDb Ver 3.0之上开发新的应用程序作为数据存储。
在性能测试中,我们发现系统存在问题。
问题在于,当我们运行如下所示的查询时,如果总结果超过某些结果(如> 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,而且我完全担心如果总结果超过数十万会发生什么。< / p>
答案 0 :(得分:1)
您可能以32位模式运行,并且需要以64位运行。
顺便说一下,你通过多次调用服务器来获取大量数据,明确地做了非常糟糕的事情。如果您需要那么多数据,请使用Streaming,但要注意在大多数情况下与大型记录集几乎没有关系
答案 1 :(得分:0)
要完成Mr.Ayende Rahien的回答,我应该提一下解决方案链接,将IIS Express更改为64位进程。