实体框架中的内存异常

时间:2011-11-22 11:53:56

标签: 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();
        }

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

2 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:1)

一笔交易600,000行太多了。我会尽量小批量地保存它。

虽然手动收藏很难看,但您可以尝试:dbef = null; GC.Collect(); GC.WaitForFullGCComplete();