我有一个使用EF4针对MS SQL Server运行的报告工具。此报告的一般大部分涉及循环大约5000行,然后为每个行拉动许多其他行。 我通过一个数据上下文拉出初始行。拉取相关行的代码涉及使用包含在using语句中的另一个数据上下文。虽然第二个数据上下文消耗的内存永远不会被释放,并且在引发内存不足异常之前使用率最高可达1.5GB。
这是代码片段,以便您可以了解:
var outlets = (from o in db.tblOutlets
where o.OutletType == 3
&& o.tblCalls.Count() > number && o.BelongsToUser.HasValue && o.tblUser.Active == true
select new { outlet = o, callcount = o.tblCalls.Count() }).OrderByDescending(p => p.callcount);
var outletcount = outlets.Count();
//var outletcount = 0;
//var average = outlets.Average(p => p.callcount);
foreach (var outlet in outlets)
{
using (relenster_v2Entities db_2 = new relenster_v2Entities())
{
//loop over calls and add history
//check the last time the history table was added to for this call
var lastEntry = (from h in db_2.tblOutletDistributionHistories
where h.OutletID == outlet.outlet.OutletID
orderby h.VisitDate descending
select h).FirstOrDefault();
DateTime? beginLooking = null;
我曾希望通过使用第二个数据上下文,在每次迭代后可以释放内存。它似乎不是(或GC没有及时运行)
答案 0 :(得分:0)
使用@adrift的输入我改变了代码,以便在循环的每次迭代之后保存更改,而不是在结束时全部。似乎存在一个限制(在我的情况下无论如何)大约150,000个待处理的写入数据上下文在消耗太多内存之前可以愉快地保存。
通过允许它在每次迭代后写入更改,看起来它可以更有效地管理内存,虽然它看起来确实使用了多少,但它没有抛出异常。