2009-10-11 11 views
17

かなり大きなファイルを読み込む必要があるアプリケーションを作成しています。私は、現代のWindows XPコンピュータ上の読み取りバッファに最適なサイズは何かを常に考えてきました。私はグーグルで、最適なサイズとして1024を持つ多くの例を見つけました。ここで最適なファイルバッファの読み取りサイズ?

は、私が言いたいの抜粋です:

long pointer = 0; 
buffer = new byte[1024]; // What's a good size here ? 
while (pointer < input.Length) 
{ 
    pointer += input.Read(buffer, 0, buffer.Length); 
} 

私のアプリケーションは非常に簡単ですので、私は任意のベンチマークコードを記述するために見ているわけではないが、共通しているものをサイズ知りたいのですが?

+0

参考になるかもしれません:http://stackoverflow.com/questions/19558435/what-is-the-best-buffer-size-when-using-binaryreader-to-read-big-files-1gb/19837238? noredirect = 1#19837238 –

答えて

7

バッファサイズは少し小さいようです。一般に、「1つのサイズはすべてに適合する」バッファサイズはありません。アルゴリズムの動作に適したバッファサイズを設定する必要があります。さて、一般的には、本当に巨大なバッファを持つのは良い考えではありませんが、小さすぎるか、各チャンクをどのように処理するかに釣り合っていないのは、どちらも素晴らしいことではありません。

データを処理する前に別のチャンクをメモリに読み込むだけの場合は、より大きなバッファを使用します。私はおそらく8kか16kを使用しますが、おそらくそれより大きくはありません。

一方、データをストリーミング形式で処理している場合は、チャンクを読み取ってから次の小さいバッファを読み取る前に処理する方が便利です。さらに、構造を持つデータをストリーミングする場合、読んでいるデータの種類に合わせて読み込むデータの量を変更します。たとえば、4文字のコード、浮動小数点数、および文字列を含むバイナリデータを読み込んでいる場合、4バイトのコードを4バイトの配列とフロートに読み込みます。私は、文字列の長さを読み取って、一度に文字列データの全体のチャンクを読み取るためのバッファを作成します。

ストリーミングデータ処理を行う場合は、BinaryReaderクラスとBinaryWriterクラスを調べます。これにより、バイナリデータを非常に簡単に扱うことができます。データそのものについて心配する必要はありません。また、作業中の実際のデータからバッファサイズを切り離すこともできます。基本ストリームに16kバッファを設定し、BinaryReaderで個々のデータ値を簡単に読み取ることができます。

+0

BinaryReaderを使用していただきありがとうございます。 BinaryReaderを使うと、長さを書くためにコードを書く必要がないので、文字列を読むときに役立ちます。 パフォーマンスが向上するかどうかを確認するために、8Kおよび16Kの読み取りをテストします。個人的にはサイズは気にしませんが、ハードウェアとオペレーティングシステムをより良く活用してパフォーマンスを向上できるかどうかを確認したいQAの人もいます。 –

+0

メモリに大量のデータをストリーミングする場合は、より大きなバッファを試すことができます。バッファサイズをディスククラスタサイズの倍数に保つ限り、最適であるはずです。正直言って、90年代後半の私の古い90年代と2000年代初頭の実践はまだ深く根こそぎになっています。このプログラムを実行しているシステムが現代的で高性能であれば、32k、64k、さらにはそれ以上のバッファも役立ちます。大きすぎると(例えば1MB)、他の要因が入り込むにつれてリターンが低下することがあります(スワップスラッシングなど)。キーは読み込みと低レベルの動作を一致させることです。 – jrista

3

アクセス時間とメモリ使用の間の線を引く場所によって異なります。バッファが大きければ大きいほど高速ですが、メモリの点では高価です。 倍数で表示ファイルシステムのクラスタサイズのがおそらく最も効率的です.NTFSを使用するWindows XPシステムでは、デフォルトのクラスタサイズは4Kです。

あなたは、このリンクDefault cluster size for NTFS, FAT, and exFAT

さようならを見ることができます。

+0

@jristaが提案した8Kと16Kの読み込みを試みます。興味深いことに、この記事ではWindowsが16 TBのディスクパーティションに8kクラスタを使用していると述べています。私は大きなパーティションを以前に見たことがありません。 –

+1

Andrew、8K、16Kは4Kの盾です – RRUZ

+0

古いハードドライブは一度に512バイトのセクタ全体を読み書きします。現代のハードドライブは4096バイトのセクタ全体を一度に読み書きします。 Windows NTFSには、(デフォルトの)クラスタサイズが4096バイトの時にあります。 Windows用のイベントトレースを使用すると、Windowsでは '16,384'バイトと' 4,096'バイト(およびそれ以下の場合は '8192'と' 49152'バイト)の実際のハードドライブI/Oが最も一般的に実行されることがわかります。理想的には、4kまたは16384バイトの倍数にしてください。 –

関連する問題