9

我正在尝试使用实体框架保存数十万条记录。保存数十万条记录后,我收到以下错误:

:System.OutOfMemoryException

我的代码

  foreach (BibContent objbibcontents in lstBibContent)
        {
            db.BibContents.AddObject(objbibcontents);
            c = c + 1;
            if (c == 1000)
            {
                db.SaveChanges();
                c = 0;
            }
        }

我注意到保存 1000 条记录后,我的数据库没有覆盖另外 1000 条记录。它将它们添加到我的 dbcontext 中。

我在 1000 条记录后创建了一个新实例,但我的数据库仍然有前一个对象的数据。查看我的代码

   foreach (var objbibcontents in lstBibContent)
            {
                vibrantEntities db1 = new vibrantEntities(szConStr);
                lstBibCon.Add(objbibcontents);
                // db.BibContents.AddObject(objbibcontents);
                c = c + 1;
                if (c == 1000)
                {
                    foreach (BibContent bibobject in lstBibCon)
                    {
                        db1.BibContents.AddObject(bibobject);
                    }
                    lstBibCon.Clear();
                    db1.SaveChanges();
                    c = 0;
                    flag = 1;
                }
            }
4

2 回答 2

13

您要保存多少个对象,单个对象有多大?DbContext 包含对您通过AddObject调用添加的所有对象的引用。调用SaveChanges不会清除其内部数据结构,因此如果您为 1M 对象调用代码,您将在内存中拥有 1M 对象并且它们将完全处于活动状态,因为它们的 GC 根对象将是仍在运行代码范围内的上下文实例.

如果您想避免内存问题,您应该为每 1000 条记录(甚至每条记录)使用一个新的上下文实例。运行 1000 条记录和运行单条记录之间的唯一区别SaveChanges是自动涉及的事务。

于 2012-12-20T10:44:32.933 回答
4

我在网上搜索,最后我找到了解决我问题的好方法。

在实体框架中插入的最快方式

于 2012-12-21T10:22:18.457 回答