.net BreezeJS:通过executequery()检索大量记录==System.OutOfMemoryException
调用executequery()返回大量(例如超过625000条)记录时是否预期System.OutOfMemoryException 使用take()可以很好地工作,例如.net BreezeJS:通过executequery()检索大量记录==System.OutOfMemoryException,.net,entity-framework,breeze,entity-framework-6,.net,Entity Framework,Breeze,Entity Framework 6,调用executequery()返回大量(例如超过625000条)记录时是否预期System.OutOfMemoryException 使用take()可以很好地工作,例如 var query = breeze.EntityQuery .from("Biography") .select("ENTITY_ID, NAME, NICKNAME") .where("VAL1","==","AL") .orderBy("ENTITY_ID") .take(100
var query = breeze.EntityQuery
.from("Biography")
.select("ENTITY_ID, NAME, NICKNAME")
.where("VAL1","==","AL")
.orderBy("ENTITY_ID")
.take(1000);
但是,请求所有记录会导致System.OutOfMemoryException错误
var query = breeze.EntityQuery
.from("Biography")
.select("ENTITY_ID, NAME, NICKNAME")
.where("VAL1","==","AL")
.orderBy("ENTITY_ID");
运行等效的SQL大约需要5秒钟才能成功完成。我并不感到惊讶
需要明确的是,您正在尝试通过网络移动超过625000条记录,然后从中创建实体。服务器上的查询可能非常快,但是这些记录中的每一条都需要序列化为json,通过网络发送,然后重新组合为一个实体。即使使用最好的实现,这些操作对于大量数据来说也可能既耗时又占用大量内存
因此,您有一些选项可以减少内存占用和操作所需的时间
您的问题是什么?当遇到System.OutOfMemoryException时,组合使用skip()和take()的多个查询结果的最佳解决方案是什么?我组合了这两个选项,并将以下内容放在查询变量赋值的末尾:take(500000).noTracking();这是可行的,但是超过500000会导致相同的内存不足异常。我想我会尝试多次查询,使用skip()和take(),每次都向数组中添加记录,除非有其他方法。有没有更好的主意?