2017-09-07 1 views
2

データモデルクラス内で、単一行を挿入して変更を保存するよりも単純な方法があります。約227レコード(408のうち)を正しく処理し、OutofMemoryExceptionを返します。これは、単一行のエントリを処理しているだけで、変更を保存していても発生しています。任意のアイデアはどのようにこの状況を解決するには?EFのあるC#コンソールアプリケーションが単一行の入力でOutofMemoryExceptionを返すのはなぜですか?

protected ADMIN_DB_Entities _AdminEntities = new ADMIN_DB_Entities(); 

public void InsertBase64Payload(string sBase64PayloadValue, string sSourceValue, Guid gSourcePrimaryKey, DateTime dDateProcessed) 
{ 
    Base64Payload newBase64PayLoadEntry = new Base64Payload(); 
    newBase64PayLoadEntry.BASE64_VALUE = sBase64PayloadValue; 
    newBase64PayLoadEntry.SOURCE_TABLE = sSourceValue; 
    newBase64PayLoadEntry.SOURCE_PRIMARY_KEY = gSourcePrimaryKey; 
    newBase64PayLoadEntry.DATE_PROCESSED = dDateProcessed; 
} 
try 
{ 
    _AdminEntities.Base64Payload.Add(newBase64PayLoadEntry); 
    _AdminEntities.SaveChanges(); 
} 
catch (Exception ex) 
{ 
    ConsoleAppLog.WriteLog(<Error Message here.>) 
} 
+0

ロードするレコードごとに、メモリ使用量が増えていますか?あなたは明らかに非常に大きなBase64値で作業しており、最終的に使用可能なすべてのメモリを占有します。 –

+0

ジャンクメモリを低く抑えるために手作業でガベージコレクションを行うか、またはEFの設定を調べて、OOM例外のポイントまで列挙しないようにする必要があります。 –

+0

https://stackoverflow.com/questions/15941471/entity-framework-4-out-of-memory-on-savechanges –

答えて

2

非常に大きなbase64のペイロードを使用しているとします。

EntityFrameworkのDbContextは、エンティティの状態をメモリに保存します。したがって、変更をデータベースに保存しても、それらの値はプロセスメモリ内に格納されます。あなたがデータベースに必要なデータを保存した後、このようなシナリオでは、コンテキストを配置した方が良いですのでDbContextは、IDisposableインタフェースを実装しています:

using (var entites = = new ADMIN_DB_Entities()) 
{ 
    try 
    { 
     entities.Base64Payload.Add(newBase64PayLoadEntry); 
     entities.SaveChanges(); 
    } 
    catch (Exception ex) 
    { 
     ConsoleAppLog.WriteLog(ex.Message); 
    } 
} 

注:内部データベースから特定のエンティティをアタッチ/あなたは解除可能なメカニズムがあることを覚えておいてくださいコンテキストのトラッキングが必要な場合は、単一のDbContextインスタンスで作業することもできます。

+0

これは私の問題を解決しました!ありがとうございました。 – Anonymous3521

関連する問題