entity-framework - Entity Framework 中的内存不足异常

标签 entity-framework out-of-memory

我需要在我的 postgres 数据库中添加一些数据,在不同的表中大约有 600,000 行,这些数据可以增长到更多。我正在使用 Entity Framework 来填充数据库。不幸的是,对于大数据,我的代码不起作用,首先它向我显示此错误“必须打开连接”,然后在下一次尝试中显示“抛出了 'System.OutOfMemoryException' 类型的异常”。公平地说,问题在于 Entity Framework 的内存消耗,因为这段代码非常适用于小数据。我试图通过调用 GC.Collection 来释放内存,但没有成功。

 public void saveChanges()
        {
            dbef.SaveChanges();
            GC.Collect();
            GC.Collect();
            dbef = new CIFImporterEF();
        }

关于解决此问题的任何想法。 谢谢

最佳答案

您错误地使用了 EF。 EF 不是解决您问题的 API。你需要大量进口,而且这个数量甚至会增长。直接使用 SQL。使用 Postrgress 的特定功能导入批量数据或使用更适合此类处理的技术。

您的代码可能有什么问题?任何事物。首先,EF 上下文是一次性的,所以从处置它开始。此外,您的 GC.Collect 对您的 dbef 没有影响,因为您仍然持有引用并且上下文持有对所有数据的引用。即使您使用@Dmitry 的建议,您仍然会发现它不起作用。如果您有基于 EntityObject 的实体或代理 POCO,这些类在内部保存对上下文的引用,因此保存对单个此类实体和整个上下文的引用就足够了,所有附加的实体仍然被认为是事件的(不是由 GC 收集) - 这很难解决,因为您必须在释放上下文之前将实体从上下文中分离出来以打破它,但分离会破坏实体之间的所有关系。

在这种情况下,正确的解决方案是不要将 EF 滥用于并非旨在解决的问题 = 批量插入。即使您解决了内存问题,性能也会很糟糕,并且导入需要很长时间。

关于entity-framework - Entity Framework 中的内存不足异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8226345/

相关文章:

c# - EF 代码首先是 : How to delete a row from an entity's Collection while following DDD?

c# - 手动键入 sql 以映射到 c# 对象,就像 .Include ("") 方法

java - 字符串和 Permgen 内存

android - 使用 picasso : out of memory exception 从 firebase 存储下载图像

c# - 如何使用 Encoding.GetString 处理大量数据? (抛出 OutOfMemoryException)

c# - EntityFramework 引用回调用方 - 找到的程序集的 list 定义与程序集引用不匹配

c# - System.Data.Entity 崩溃 IIS 的 native 图像

c# - Entity Framework 错误 : The ForeignKeyAttribute on property is not valid

java - 管理流使用期间的内存使用情况

android - 处理多个大位图时内存不足