实体SaveChanges生成System.OutOfMemoryException

时间:2014-09-18 14:20:47

标签: c# .net database linq entity

我有一个进程获取数据块然后更新并保存它们

这个过程是50K记录的每一块(总计大约400K),但我总是得到一个System.OutOfMemoryException大约一半(当进程内存达到1.4GB时)

IEnumerable<Contacts> allContacts = objDB.Contacts.OrderBy(p=>p.Period).AsEnumerable();

int chunkSize = 50000;
int curCount = 0;

while (true)
{
    var chunk = allContacts.Skip(curCount).Take(chunkSize).AsEnumerable();
    curCount += chunkSize;

    int count = chunk.Count();
    if (count == 0) break;

    UpdateContacts(chunk);

    GC.Collect();
    GC.WaitForPendingFinalizers();
}         

我尝试强制垃圾收集器,在每个SaveChanges之后创建一个新的上下文,在.config中添加gcAllowVeryLargeObjects键仍然没有去

有什么想法吗?

UpdateContacts()没什么特别的:

private void UpdateContacts(IEnumerable<Contacts> allContacts)
{
    foreach (Contact contact in allContacts)
    {
        //update stuff here
    }

    objDB.SaveChanges();
    objDB = new DBContext(); 
}

1 个答案:

答案 0 :(得分:0)

我最终生成了UPDATE SQL语句,并且只使用Select(...)指定了我在第一行中需要的列