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レコードごと(またはすべてのレコード)に新しいコンテキストインスタンスを使用する必要があります。SaveChanges1000レコードの実行と単一レコードの実行の唯一の違いは、自動的に含まれるトランザクションです。

于 2012-12-20T10:44:32.933 に答える
4

私はWebで検索し、ついに問題の良い解決策を見つけました。

EntityFrameworkに挿入する最速の方法

于 2012-12-21T10:22:18.457 に答える