【发布时间】:2010-11-17 14:35:50
【问题描述】:
我有一个使用 EF4 针对 MS SQL Server 运行的报告工具。该报告的大部分内容涉及循环大约 5000 行,然后为每一行拉出许多其他行。 我通过一个数据上下文提取初始行。提取相关行的代码涉及使用另一个数据上下文,包装在 using 语句中。虽然看起来第二个数据上下文消耗的内存从未被释放,并且在引发内存不足异常之前使用量会飙升至 1.5GB。
这里是代码的 sn-p,以便您了解想法:
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 没有及时运行)
【问题讨论】:
-
foreach中还发生了什么? -
有一些代码可以为出口拉取子行并执行一些计算。然而,有相当多的这些行。最终结果是一组新对象添加到要保存到数据库的外部数据上下文中
-
我怀疑添加到外部上下文是导致问题的原因。如果您只注释掉添加到外部数据上下文的代码,您的内存使用情况是否正常?一般来说,我不认为您希望打开一个上下文并同时保存大量要提交的更改。
-
感谢您的想法。我会试一试,然后回复你
标签: entity-framework memory garbage-collection