2017-06-05 6 views
-1

初めてテーブルのデータをリストに入れてから別のテーブルから別のデータを選択するためにリストをクリアします私は新しいデータをますます入手するので、メモリから解放されるリスト。"System.OutOfMemoryException" ado.netを使用して700kのレコードを取得中C#

私が試してみました:

List.Dispose(); 
List.Clear(); 
List = null; 
GC.Collect(); 
をしかし、メモリがいっぱいに保ちます。

は、Entity Frameworkで私はそれを考え出したと .AsNoTracking()を追加し、それが働いたとメモリが

をクリアされている。しかし、私はADO.Netを使用する必要があります。

+4

私は質問が表示されません。 –

+0

収集の後にGC.WaitForPendingFinalizers()を追加しようと思います。 –

+0

700kレコードのメモリに...考えようとしています...なぜそれが必要ですか? – Reniuz

答えて

7

GCに何をすべきかを伝えることはできません。 GCはリリースしたいものをリリースします。記憶力が弱いときには、通常は非常に良いです。 のリリースでない場合は、オブジェクトにまだ到達可能性があると思われます。特に、のイベントは、人々が誤ってたくさんのオブジェクトを到達可能にする非常に一般的な方法です。だから、あなたは何もないイベントがないかどうかチェックしたいかもしれません。

ですが、GCに影響を与える方法はほとんどありませんが、私はそれが修正ではないと思うので、ここでブードーコマンドを含めるつもりはありません。

ADO.NET はここに責任がありません。です。 EFは、の上にを実行します。 ができます。はリストを避けてください。; のようなデータを読み取ることができます。はリストに入る必要がありますが、リーダーを操作するだけです。あるいは、 "dapper"(ADO.NET上の非常に細いヘルパー)のようなツールを使用している場合は、.Query<T>(...., buffered: false)を使うことができます(通常、人々は70万行を読み込まないのでデフォルトでバッファリングされます)。

リストのトピックでは、大きなリストが「大きなオブジェクトヒープ」に当たることに注意してください。これは、コレクションに多くの影響を与えます。

関連する問題