我有一个有五十万行的表。我需要更新每一行,但ToList()失败:
List<Contacts> allContacts = objDatabase.Contacts.ToList();
每次都会收到System.OutOfMemoryException。有办法解决这个问题吗?
我已经有了App.Config的解决方法,但仍然没有:
<gcAllowVeryLargeObjects enabled="true" />
我使用的是具有8GB RAM的64位机器
答案 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;