2016-09-29 60 views
5

StreamReaderを以下のように使用すると、どれだけのメモリが影響を受けますか?私は、各行が変数 '行'に読み込まれているので、その行だけがメモリに残っていることを前提としており、全体的には良いことです。何千もの行を含む非常に大きなものを読むと、私の目的はメモリをあまりにも多く消費することではありません。明確化が認められるでしょう。StreamReaderの影響を受けるメモリの量

string line = string.Empty; 
using(StreamReader Reader = new StreamReader(@"C:\Users\UK\Panfile.txt")) 
{ 
    while((line = Reader.ReadLine())!= null) 
    { 
     //other code to process the line now being read. 
    } 
Reader.Close(); Reader.Dispose(); 
} 
+0

すぐに関係のないコメントとして、usingステートメントでStreamReaderをラップしたので、CloseとDisposeを呼び出す必要はありません。 – mbrdev

+0

メモリ消費の詳細についてはあまりよく分かりません。しかし、私はそれがStreamReader経由で読み込もうとしているファイルのサイズに依存していると確信しています。ファイルごとに異なるので、各ファイルごとに異なるメモリ使用量が期待できます。 – Benjamin

+0

あなたは@ベンジャミンあなたのポイントをより明確にしますか?私のファイルには何十万もの行が含まれています。メモリには1行しか保存されないので、ファイルのサイズはどのようにメモリに影響しますか?私はそれを知ることはできません。 – Unnikrishnan

答えて

7

StreamReaderは、呼び出しの間にメモリのbyteBuffer.Lengthを使用します。デフォルトを指定していない場合は、1024バイトを使用します。また、encoding.GetMaxCharCount(bufferSize);char[] charBufferを割り当て、配列内の要素ごとに2バイトを割り当てます。

Streamオブジェクトを渡さずにそれを生成させる場合は、FileStreamという名前のデフォルトのファイルストリームバッファーを使用します(4096)。

ReadLine call itselfが内部StringBuilderを割り当てますし、バイトをデコードし、charBufferに保管し、その後byteBufferにデータを読み込みます、それはその後、charBufferの外に、その後を経由して、あなたに返されStringBuilderに文字をコピーします.ToString()コール。

したがって要約すると、安静時new StreamReader(@"C:\Users\UK\Panfile.txt")、それはメモリ(5120合計)の1024 + (1025 * 2) + 4096 バイトを割り当てるであろうし、ReadLine中、追加line.Length * 2 + StringBuilderOverhead + line.Length * 2 せいぜい割り当てる呼び出します。あなたが見る*2char[]のため、それぞれcharが2バイトを占めるためです。


1:byteBuffer + charBuffer + FileStreamバッファ
2:StringBuilder +ストリングビルダーバッファー+ .ToString()呼び出しによって返される文字列内の任意のスラック空間の内部char[]

+0

あなたのおかげで@Scott Chamberlain。どうもありがとうございました。 – Unnikrishnan

2

一度に1行しか保持しないので、この方法は大量のファイルを処理するのに最適です。

+0

ああ。あなたの答えは非常に@mbrdevありがとうございます。すばらしいです。 – Unnikrishnan