加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读