我正在构建一个应用程序并且正在使用Entity Framework 6.但是我正在遇到内存使用问题。无论我尝试什么,我迟早会遇到内存不足的错误。到目前为止,我尝试了以下内容:
但是这些都没有阻止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()
}
答案 0 :(得分: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();
}
}
这反转了使用声明在每批之后处理sqllite,从而将其清除并为每批开始新鲜。
这段代码是用记事本++编写的,所以如果你试一试,请小心清理它。