2017-10-31 1 views
0

多数のレコードを持つテーブルを反復処理する正しい方法は何ですか?私はテーブルでこれまでの記録を評価する必要があります。私はEntity Frameworkを使用してMS SQLデータベースに接続して情報を取得しています。私は単純なforeachループを使用していました。Entity Framework foreachで80万レコードを超えるテーブル

foreach (var x in MyEntity.MyTable) 
{ 
    //logic process 
} 

これは、50万レコード(正確な数字がない)未満のテーブルでは完全に機能します。問題は、大きなテーブルにヒットしたときに、アプリケーションが不安定になり、クラッシュするレコード数が800,000を超える場合です。私は(4〜6ギガバイト程度)RAMの多くを使用しているアプリに注意してください

+2

ページングを実装します。一度にすべてのレコードをメモリに保存する必要はほとんどありません。また、アプリケーションは単に「不安定になりクラッシュする」だけでなく、例外を与えます。あなたはその例外を研究しようとしましたか? – CodeCaster

+1

あなたのプロセスは賢明ですか?または、この操作をSQLだけにしてみてください。 –

+1

一度に500kレコードを処理しますか? –

答えて

3

使用AsNoTracking

foreach (var x in MyEntity.MyTable.AsNoTracking()) 

それはEFと意志によって追跡されていない上、テーブル内の各項目が繰り返されるように、これはそれを保証しますDbContextには張り付いていないので、必要に応じてインスタンスをCLRでGCすることができます。

これは、アイテムを変更することはできず、それらをDbContextに残すことを期待していることに注意してください。そうするためにインスタンスをアタッチする必要があります。


これは、大量のメモリを消費しますが示されていないコード内の他の問題がないことを前提としません。

+2

これはデータベースからの800Kレコードを要求するクエリを実行しますが、これはおそらく不要です。 – CodeCaster

関連する問題