实体框架中的内存异常

Has*_*hem 3 entity-framework out-of-memory

我需要在我的postgres DB中添加一些数据,在不同的表中大约600,000行,这可以增长到更多.我正在使用实体框架工作来填充数据库.不幸的是,对于大数据我的代码不起作用,首先它向我显示这个错误"连接必须打开",并在下一次尝试中说"抛出类型'System.OutOfMemoryException'的异常".公平地说,问题是实体框架的内存消耗,因为这个代码可以很好地处理小数据.我试图通过调用GC.Collection释放内存,但它没有工作.

 public void saveChanges()
        {
            dbef.SaveChanges();
            GC.Collect();
            GC.Collect();
            dbef = new CIFImporterEF();
        }
Run Code Online (Sandbox Code Playgroud)

有关解决此问题的任何想法.谢谢

Lad*_*nka 7

您使用的EF不正确.EF不是您的问题的API.你需要大量进口,这个数量甚至可以增长.直接使用SQL.使用Postrgress的特定功能导入批量数据或使用更适合此类处理的技术.

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

在这种情况下,正确的解决方案不是滥用EF而不是设计解决的问题=批量插入.即使你解决了内存问题,性能也会很糟糕,导入也需要很长时间.

  • 谢谢,那么什么是最好的解决方案?用于批量复制 (2认同)