2017-03-21 4 views
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のコードメモリの成長でより多くの配列サブと。

+1

「元の」大きな「データ」を参照していない場合は、メモリが不足しているときに自動的に収集されます。本当にコレクションを強制したいのであれば、 'GC.Collect()'(普通はやってはいけません)。 Visual Studioの下でプログラムを実行すると、GCが少ないメモリを収集することに注意してください(収集できる内容はより慎重になります) – xanatos

+0

テストコードも貼り付けることができますか? 'GC.Collect()'を呼び出すことは決して良い考えではありません。代わりに、元のbyte []データがもはや有効範囲外になるように(つまり{}の外に)テストコードをリファクタリングします。これによりGCによって収集されます。 また、 'Data = null'または' Data = new byte [0] 'を設定することもできます。これにより、変数ポインタがヒープ上の新しい配列に変更され、古い配列はもはやその配列への参照を持たず、コレクションの準備が整います。 –

+0

GC.Collect()は約2MBのメモリを削減し、私の問題では正しく動作しません。私は1つの配列しか持っていないので、私は彼を切断する必要がある、私はメモリ内のコピーを必要としません。私は180MBのメモリを持ちたいと思います。もし私が繰り返しアレイを切断すると、このメモリは成長するのではなく、減らさなければなりません。 – user1173536

答えて

0

Garbage Collectorにそのことをさせる必要があります。 GCを簡単にするために、通常は古い未使用参照をnullに設定するか、新しい参照値で置き換えます。 GCには時間がかかります。

関連する問題