2012-12-19 11 views
9

私は、エンティティフレームワークを使用して何十万ものレコードを節約しようとしています。System.OutOfMemoryException Entity Frameworkを使用していますか?

:何千ものレコードの数百を保存した後、私は、エラー、次の取得System.OutOfMemoryExceptionに

私のコード

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

私は1000年に私のDBは、別の1000件のレコードが上書きされていない記録し保存した後に気づきました。それらを私のdbcontextに追加しています。

1000個のレコードの後に​​新しいインスタンスを作成していますが、dbには以前のオブジェクトのデータが残っています。私のコードを参照してください

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; 
       } 
      } 

答えて

12

あなたはいくつのオブジェクトを保存しようとしていますか? DbContextは、AddObject呼び出しで追加したすべてのオブジェクトへの参照を保持します。 SaveChangesを呼び出すと内部データ構造がパージされないので、1Mオブジェクト用にコードを呼び出すとメモリに1Mオブジェクトがあり、GCのルートオブジェクトは実行中のスコープにあるコンテキストインスタンスになるため完全に有効になりますコード。

メモリの問題を回避するには、1000レコード(またはすべてのレコード)ごとに新しいコンテキストインスタンスを使用する必要があります。 SaveChangesを1000レコードと1レコードだけ実行する唯一の違いは、自動的に行われるトランザクションです。

+0

私はむしろ私のdbcontextをクリアし、再度作成することができますか? –

+0

あなたは、追加された各オブジェクトをデタッチして設定する必要があります。新しいコンテキストインスタンスを作成する方がはるかに良い方法です。 –