2016-09-08 42 views
5

我建立一个应用程序,并正在使用实体框架6.但我到内存使用的问题上运行。无论我尝试什么,我迟早会遇到内存不足错误。到目前为止,我已经尝试了以下内容:实体框架6内存达到2GB

  • 使用using作为上下文。
  • 保存批次更改和处理上下文。
  • 手动调用GC.Collect()。

但是,这些都没有阻止Entity框架使用更多的内存与我做的每个saveChanges。最终达到2GB的限制并导致我的程序崩溃。

有什么办法,我不知道的,使实体框架版本的所有记忆?

编辑

using (var sqlite = new myEntities()) 
{ 
    sqlite.Configuration.AutoDetectChangesEnabled = false; 
    sqlite.Configuration.ValidateOnSaveEnabled = false; 

    foreach (var someItem in someList) 
    { 
     var newItem = new Item 
     { 
      ... 
     }; 

     sqlite.tableName.Add(newItem); 

     if (++countRecords%1000 == 0) 
     { 
      sqlite.SaveChanges(); 

     } 
    } 
    sqlite.SaveChanges(); 
} 

如上所述以上我还尝试设置上下文,而不使用和调用SaveChanges后设置它。

if (++countRecords%1000 == 0) 
{ 
    sqlite.SaveChanges(); 
    sqlite.Dispose(); 
    sqlite = new myEntities()  
} 
+2

是否为每个数据库请求创建新的Context实例? – Lance

+6

要获得帮助,您需要找出一种方法来创建一个能够再现内存问题的最小但完整的程序。否则,正如你可以理解的那样,我们建议的任何事情都将是纯粹的猜测。 – sstan

+1

你能分享你的EF查询吗? – Sampath

回答

1

如果这的确是一个批次的问题,尝试这样的事情:

int batchSize = 10; 

for (int i = 0; i < = someList.Count/batchSize; i++) 
{ 
    var batch = someList.Skip(batchSize * i).Take(batchSize); 

    using (var sqllite = new nyEntities()) 
    { 
     foreach(var item in batch) 
     { 
      var newItem = new Item() {...}; 

      sqllite.tableName.Add(newItem); 
     } 

     sqllite.SaveChanges(); 
    } 
} 

这反转using语句每批后处置sqllite,从而清除出去,开始新的每批。

这段代码在记事本写了++,所以要小心把它清理干净,如果你尝试一下。

+0

是否批量问题我真的很喜欢这个流程,谢谢。 – BeebFreak