c# – DbContext OutOfMemoryException
发布时间:2020-12-15 22:18:54 所属栏目:百科 来源:网络整理
导读:我有一个DbContext,其数据集大于20M,必须转换为不同的数据格式.因此,我将数据读入内存,执行一些任务然后处理DbContext.代码工作正常,但过了一段时间我得到OutOfMemoryExceptions.我已经能够将其缩小到下面的代码片段,在那里我检索2M记录,然后释放它们并再次
我有一个DbContext,其数据集大于20M,必须转换为不同的数据格式.因此,我将数据读入内存,执行一些任务然后处理DbContext.代码工作正常,但过了一段时间我得到OutOfMemoryExceptions.我已经能够将其缩小到下面的代码片段,在那里我检索2M记录,然后释放它们并再次获取它们.第一次检索工作得很好,第二次检索抛出异常.
// first call runs fine using (var dbContext = new CustomDbContext()) { var list = dbContext.Items.Take(2000000).ToArray(); foreach (var item in list) { // perform conversion tasks... item.Converted = true; } } // second call throws exception using (var dbContext = new CustomDbContext()) { var list = dbContext.Items.Take(2000000).ToArray(); foreach (var item in list) { // perform conversion tasks... item.Converted = true; } } GC不应该自动释放第一个使用块中分配的所有内存,这样第二个块应该像第一个块一样运行吗? 在我的实际代码中,我不会一次检索200万条记录,而是在每次迭代中检索0到30K之间的记录.然而,大约15分钟后,我的内存耗尽,尽管所有对象都应该被释放. 解决方法
我怀疑你遇到了LOH.可能你的对象比threashold更大,他们到达那里,因此默认情况下GC没有帮助.
试试这个:https://www.simple-talk.com/dotnet/.net-framework/large-object-heap-compaction-should-you-use-it/ 看看你的例外是否消失了. 即在第一和第二部分之间添加: GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce; GC.Collect(); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |