0
単純なバイト[]コピーに問題があります。 ConsoleApplicationでは75MBのDATファイルをbyte []にロードします。その後、私は機能の怒涛の配列をカットしたいと思います。私が使用している場合はバイト配列コピーでメモリが増えています
public static byte[] SubArray(this byte[] Data, int Index, int Length = 0)
{
if (Length == 0) Length = Data.Length - Index;
byte[] Result = new byte[Length];
Array.Copy(Data, Index, Result, 0, Length);
return Result;
}
一つだけデータ= Data.SubArray(32)は、メモリが180メガバイトまで100から成長するが、私は3回データ= Data.SubArray(32)でテストを行う場合には、メモリは3倍になり、340MBになります。私は古い配列がまだメモリにあると思います。古い配列をメモリからどのように解放するのですか?私はもはやそれを必要としないし、2GBのコードメモリの成長でより多くの配列サブと。
「元の」大きな「データ」を参照していない場合は、メモリが不足しているときに自動的に収集されます。本当にコレクションを強制したいのであれば、 'GC.Collect()'(普通はやってはいけません)。 Visual Studioの下でプログラムを実行すると、GCが少ないメモリを収集することに注意してください(収集できる内容はより慎重になります) – xanatos
テストコードも貼り付けることができますか? 'GC.Collect()'を呼び出すことは決して良い考えではありません。代わりに、元のbyte []データがもはや有効範囲外になるように(つまり{}の外に)テストコードをリファクタリングします。これによりGCによって収集されます。 また、 'Data = null'または' Data = new byte [0] 'を設定することもできます。これにより、変数ポインタがヒープ上の新しい配列に変更され、古い配列はもはやその配列への参照を持たず、コレクションの準備が整います。 –
GC.Collect()は約2MBのメモリを削減し、私の問題では正しく動作しません。私は1つの配列しか持っていないので、私は彼を切断する必要がある、私はメモリ内のコピーを必要としません。私は180MBのメモリを持ちたいと思います。もし私が繰り返しアレイを切断すると、このメモリは成長するのではなく、減らさなければなりません。 – user1173536