2009-02-26 7 views
5

例:私は、ファイルを読み込むと、ファイルの合計サイズは、任意の時点でメモリを占有します、それは.NETストリームを介して他のファイルにコピーする場合.NET Streamsはメモリを節約しますか?

  1. ?または、バイトが使用されるとすぐに破棄されますか?
  2. 単純なアプローチではメモリを節約できない場合は、バッファリングされたStreamsはそれを行いますか?
+0

大きな質問! :) – overslacked

答えて

13

コピーをストリーミングする、つまりバッファを読み込む、バッファを書き込む、バッファを読み込む、バッファを書き込むなどの方法でデータがなくなるまでは、バッファサイズと同程度のメモリしか消費しません。私はFile.Copyがこれを行うことを期待しています(ネイティブWindowsコードでは、間違いなく)。

あなたはそれを自分で行いたい場合は、このようなものを使用します。これが唯一のストリームであるが、大きな32Kがかかります

public void CopyData(Stream input, Stream output) 
{ 
    byte[] buffer = new byte[32 * 1024]; 
    int read; 
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     output.Write(buffer, 0, read); 
    } 
} 

を。

EDIT:コメントに記載されているように、ストリームにも独自のバッファが存在する可能性がありますが、メモリを使い果たしずに非常に大きなファイルを転送できるという点があります。

+0

... +ストリームで使用される内部バッファのサイズ(FileStreamはデフォルトで4Kのサイズを持つ内部バッファを使用します) – Joe

+0

.NET FileStreamには独自の内部バッファがあります。だからFileStreamsで上記のコードを使用すると、おそらく32K以上のメモリ(32K + FileStreamの内部バッファのサイズに関係なく)が必要です。しかし、いずれの場合でも、一定量のメモリがこの手法で使用されます。 –

+0

良い点、皆さん。更新中... –

3

ReadToEnd()のようなものを呼び出すと、ファイルの内容がメモリに読み込まれます。あなたは、ファイルのデータのサブセットだけがいつでもメモリにロードされるようにするには、バッファを使用することが適切なアプローチであると推測するのは間違いありません。

2

いいえ、ファイル全体がメモリにロードされません。

メモリフットプリントは、読み書きに使用するバッファのサイズと、ストリームによって維持されるすべての内部バッファによって決まります。

FileStreamクラスは、コンストラクタのオーバーロードでサイズを指定できる内部バッファを使用します。デフォルトは0x1000バイトです(おそらく実装依存 - この値はLutz Reflectorを使用してFileStreamクラスを調べることによって取得された値です)。

1

これは実際の方法によって異なります。 ReadToEnd()でストリームを一時的なエンドポイントとして使用している場合は、ファイル全体をメモリにロードできます。代わりにバッファリングしている場合は、バッファサイズを超えるオーバーヘッドを使用することはありません。

+0

概要:ReadToEnd()はTextReaderに存在し、Streamでは存在しません。 –

関連する問題