巨大的内存消耗(MVC 5 + EntityFramework 6.2.0)

时间:2018-06-07 11:18:22

标签: c# entity-framework entity-framework-6 autofac

我对使用大量内存的项目感到担忧。我已经使用Entity Framework配置了我的MVC 5项目。我也使用Autofac。

通过执行以下操作找到我的存储库类和服务类(位于同一个项目中):

builder.RegisterAssemblyTypes(typeof(PlanRepository).Assembly)
            .Where(t => t.Name.EndsWith("Repository"))
            .AsImplementedInterfaces().InstancePerLifetimeScope();

(与该项目中的服务类似。)

现在我可以看到调试时我初始化我的_dbContext(如果它还没有),最后我可以看到dispose被成功调用。启动页面后,内存使用量约为460兆,如果我继续刷新,它会略微上升并达到500兆,当我停止10~15分钟后,它会回落到大约460兆。

现在我想测试一下,所以我使用以下模型创建了一个DBSet:

    public class Email
    {
       public int ID { get; set; }
       public string Subject { get; set; }
       *[StringLength(32, ErrorMessage = "Must be under 32 characters")]*
       public string From { get; set; }
       public DateTime Sent { get; set; }
       public long Size { get; set; }
       public Boolean HasAttachment { get; set; }
     }

需要考虑两件事:

  • 我使用上述电子邮件
  • 200,000条记录加载了DBSet
  • 每个记录的主题字段设置为长度为2500个字符的字符串

现在当我添加对我的方法的调用以通过以下方式检索数据时:

var emails = _dbEmailService.GetAllEmails().AsQueryable();

我的内存使用率高达 2Gig ...然后每次刷新再加上1 Gig

这真的很糟糕不是吗?我可以帮忙找出原因吗? 我在这上花了1.5天而且非常沮丧。感谢。

1 个答案:

答案 0 :(得分:0)

感谢大家的帮助。好吧,你的问题让我回过头来重新评估我的分页方法。最初我遇到了与分页相同的问题,这就是我开始尝试检索所有记录以查看瓶颈所在的原因。但是现在仔细观察之后,我注意到分页并没有真正起作用,因为我的Lambda正在检索所有记录,而不仅仅是IQueryable。然后出现了第二个问题,即对DB的请求需要3秒钟。这是由于ID列上缺少索引。一旦我添加它,一切都开始工作,内存占用少,速度非常快。从屏幕上休息几个小时就可以做到。 :)