我有一个进程获取数据块然后更新并保存它们
这个过程是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();
}
答案 0 :(得分:0)
我最终生成了UPDATE SQL语句,并且只使用Select(...)指定了我在第一行中需要的列