2012-02-08 12 views
0

ファイルを読み込むプログラムがあります。これらのファイルは大抵、数百MBになることがあります。これを実行しているコンピュータは強力ですが、これは問題ありません。私はいつも、前を想定していた新しく割り当てられたオブジェクトに変数を繰り返し再割り当てした後でメモリ不足例外が発生する

myBigFile = new BigFile(fileName); 

つだけのファイルは、一度にロードすることができ、そして新しいものがロードされたとき、私は、既存のファイルオブジェクトに新しいファイル、例えば再割り当てファイルはメモリから消去されますが、いくつかのファイルを1つずつ読み込んだ後に、メモリ不足例外が発生することがよくあります。

ファイル変数に新しいファイルを割り当てる前にGC.Collect()に電話する必要がありますか?私はそれがもはや使用されなくなったら、Windowsは以前のメモリをクリアすると仮定していましたか?

EDITいくつかの有益なコメントにさらに

、私は戻って、多かれ少なかれマイクロソフトのテンプレートを使用して、関連するクラスとサブクラスでIDisposableをを実装:

例えば、nullにクラスの配列を設定し、どこ新しいファイルをロードすることについて、私がやったとき、次その後

public void Dispose() 
{ 
    for (int i = 0; i < myArrayOfClassType.Length; i++) 
    { 
     myArrayOfClassType[i].Dispose(); 
    } 

    myChannels = null;     

    GC.SuppressFinalize(this); 
} 

:各サブタイプものDispose()メソッドを持ってい

if (myBigFile != null) 
{ 
    //dispose any previous instance: 
    myBigFile.Dispose(); 
    myBigFile = null; 
    GC.Collect(); 
} 

myBigFile = new BigFile(fileName); 

しかし、新しいファイルを読み込むときには一般にエラーが発生し、ロードされているにもかかわらず、新しく読み込まれたファイル内の配列はnullになります。

すぐに処理されないことがありますか、関連するクリーンアップが発生したときに新しいファイルが存在することがあります。そのため、部分的にすぐに処理されていますか?

洞察力があれば幸いです。

+3

あなたの 'BigFile'クラスはアンマネージドリソースを処分していますか?もしそうなら、リソースを適切に解放するために 'using'ブロックで囲むことができます。 –

+2

クラスに使い捨てのメンバーがある場合は、IDisposableを実装する必要があります。完了したら、それを廃棄する必要があります。 – cadrell0

+1

どうやってファイルを読んでいるのですか?あなたがファイルを読んだ後でリソースを処分していない可能性があります。 – ctorx

答えて

0

ファイルのロード時に割り当てられている配列がラージオブジェクトヒープを取得するのに十分な大きさである場合、断片化からOutOfMemoryExceptionが発生する可能性があります。 LOHを1.5GBの空き容量があるが、最大の空き容量が100MBのところに分割し、101MBを割り当てようとすると、OutOfMemoryExceptionが発生します。

LOHサイズを見てパフォーマンスカウンタを調べることで、このような場合の考えを得ることができます。

関連する問題