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

问题描述 投票:0回答:1

我对使用大量内存的项目有些担忧。我已经使用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; }
     }

需要考虑的两件事:

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

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

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

我的内存使用率高达2Gig ......然后每次刷新它都会增加1 Gig。

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

c# entity-framework entity-framework-6 autofac
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.