实体框架太慢/内存泄漏

本文关键字:内存 泄漏 框架 实体 | 更新日期: 2023-09-27 18:07:41

我正在做大量的工作与实体框架,像数百万的插入和更新。
然而,随着时间的推移,它变得越来越慢…

我尝试了一些方法来提高性能。如:

db.Configuration.AutoDetectChangesEnabled = false;
db.Configuration.ValidateOnSaveEnabled = false;

try too:

db.Table.AsNoTracking();

当我改变所有这些东西时,它真的变得更快了。然而,内存使用开始增加,直到它给我一个异常。

有人遇到过这种情况吗?由于

实体框架太慢/内存泄漏

DbContext存储您已获取或添加到DbSet的所有实体。正如其他人建议的那样,你需要在每组操作(一组密切相关的操作-例如web请求)之后处理上下文,并创建一个新的上下文。

在插入数百万个实体的情况下,这可能意味着每1,000个实体创建一个新的上下文。这个答案为您提供了插入数千个实体所需的所有信息。

如果您只做插入和更新-尝试使用db.Database。SqlQuery(变量、对象)。

实体框架将所有附加对象保存在内存中。因此,拥有数百万个这样的对象可能会导致内存泄漏。

https://github.com/loresoft/EntityFramework.Extended为更快的批量更新和删除提供了一个干净的界面。我认为它只适用于SQL Server,但它可能会给你一个快速解决你的性能问题。

可以这样更新:

context.Users.Where(u => u.FirstName == "Firstname").Delete();

可以用类似的方式进行删除:

context.Tasks.Where(t => t.StatusId == 1).Update(t => new Task { StatusId = 2 });

对于数百万的插入和更新,所有的东西都耗尽了内存,我已经尝试了所有的…
只有当我停止使用上下文并使用ADO或另一个Micro ORM如Dapper时才对我有效。