2009-07-23 15 views
0

私は処理する150万件のリストを含む大きな2GBファイルを持っています。私はいくつかの文字列の操作を実行し、各リスティングをデータベースにアップロードするコンソールアプリケーションを実行しています。C#.NET Linqメモリのクリーンアップまたはリーク?

  1. Iは、LINQオブジェクトを作成し、各リスト(ループ)のための新しいLinqObject()に割り当てることによって、オブジェクトをクリア。

  2. オブジェクトが完成したら、それをリストに追加します。

  3. リストが100個のオブジェクトに達すると、リスト全体に対してsubmitAllを実行し、リストをクリアしてから、繰り返します。

プログラムの実行中にメモリ使用量が増加し続けています。メモリ使用量を抑えるために何かすべきことはありますか?私はGC.collectを試しました。私は処分を使いたいと思う。

お探しになりました。

+0

はい、私は低い状態を維持するためにメモリ使用量が必要です。これはわずか100kのリスティングの後で350 MBにまで成長します。私はそれを実行したときにメモリ使用量をチェックしていませんでした。プログラムは110万リストにロックされていました。メモリ使用量はおそらく1GBを超えていた – Bryan

+0

メモリプロファイラを使用して問題を見つけます。それはそのためのものです。 –

+0

何をしているのかを示すコードを投稿できますか? –

答えて

2

プログラムのメモリ使用量が増えると正常です。リソースを節約しようとすると、メモリ使用量を減らすようにガベージコレクタに強制しないでください。リソースを無駄にする可能性が最も高くなります。

最初の反応とは対照的に、空きメモリが残っている限り、高いメモリ使用率はパフォーマンス上の問題ではありません。未使用のメモリをたくさん持っていても、パフォーマンスは少し向上しません。メモリ使用量を減らすだけでメモリ使用量を減らそうとすると、CPU時間を無駄にしてクリーンアップが不要になります。

空きメモリが不足している場合、または他のアプリケーションで必要な場合は、ガベージコレクタが適切なクリーンアップを行います。ほぼすべての状況で、ガベージコレクタは、コードを記述するときに予想されるよりも、現在のメモリ状況についてもっと多くのことを知っています。

IDisposableインターフェイスを実装するオブジェクトを使用している場合は、Disposeメソッドを呼び出してアンマネージリソースを解放する必要がありますが、他のすべてのオブジェクトはガベージコレクタによって処理されます。管理オブジェクトは通常、メモリをまったくリークしません。

0

あなたはが必要ですあなたのメモリ使用量は低く抑えられますか?実際の機能上の問題がなければ、メモリ使用量自体は問題ではありません。

0

メモリ使用量はどのくらい大きくなっていますか? .NETが効果的に「安定化」している可能性があります。

あなたはこれをやっている方法を正確には分かりませんが、一般的な原則は大丈夫です。私はあなたが方程式のデータベースワークを取ることをお勧めします - ちょうど実際にデータベースに提出する行をコメントアウトしてください。使用するメモリの量を確認してください。 StreamReader(または何でも)以外に、データベースに触れていない場合には、変換されたオブジェクトのバッチを構築し、それらを投げ捨てるだけで、処分する必要があるものはもうありません。

+0

はい、私はStreamReaderを使用しています。しかし、私は実際にオブジェクトを投げ捨てていますか? 私は提出した後にリスト上で.clear()を使用します。私はlinqオブジェクトを一度宣言してから、新しいSomeLinqObject()を宣言することによって各オブジェクトのためにそれを上書きします。 – Bryan

+0

提案していただきありがとうございます。メモリ割り当ては、500kリスティング後にデータベースに提出することなく1GBに増えます。 – Bryan

+0

私は実際に古いものをクリアするのではなく新しいリストを作成しますが、それはそのままでいいはずです。私はメモリ割り当てについて驚いています...あなたはいくつかのサンプルコードを投稿できますか? –

関連する問題