entity .ToList()生成一个System.OutOfMemoryException

时间:2014-09-17 21:03:34

标签: c# .net linq entity tolist

我有一个有五十万行的表。我需要更新每一行,但ToList()失败:

List<Contacts> allContacts = objDatabase.Contacts.ToList();

每次都会收到System.OutOfMemoryException。有办法解决这个问题吗?

我已经有了App.Config的解决方法,但仍然没有:

<gcAllowVeryLargeObjects enabled="true" />    

我使用的是具有8GB RAM的64位机器

3 个答案:

答案 0 :(得分:2)

这是使用分块的解决方案。它会在每个块之后处理容器(和下载的实体)。在系统内存不足之前,GC应该释放内存。

int chunkSize = 50;
int curCount = 0;

while (true)
{
    using (var db = new DbEntities())
    {
        var chunk = db.Contacts.Skip(curCount).Take(chunkSize).ToArray();
        curCount += chunkSize;

        if (chunk.Length == 0) break;

        foreach (var contact in chunk)
        {
            //do any work for the contact here
            contact.Something = "SomethingNew";
        }

        db.SaveChanges();
    }
}

随意玩一下块大小。块越大,整个过程应该越快,但它会占用更多内存。

答案 1 :(得分:0)

怎么样

IEnumerable<Contacts> allContacts = objDatabase.Contacts.AsEnumerable();

永远不要将allContacts转换为列表。只需使用就像一个枚举器并应用Foreach循环来访问每个联系人。

答案 2 :(得分:0)

尝试

foreach (Contacts c in objDatabase.Contacts) c.value = newvalue;