2013-03-21 14 views
13

私の関数では、ファイルからバッファにデータを読み込み、データを操作して別のファイルに書き戻す必要があります。ファイルは不明なサイズであり、非常に大きい場合があります。read-process-writeの最適なバッファサイズ

小さなバッファを使用すると、読み書きサイクルが長くなり、時間がかかることがあります。これとは対照的に、長いバッファとは、より多くのメモリを消費する必要があることを意味します。私が使用すべき最適なバッファサイズは何ですか?このケースは依存していますか?

巨大なファイルを効率的に管理するWindowsでは、「Tera copy」のようなアプリケーションがいくつか見られました。私が知っておくべき他のテクニックやメカニズムはありますか?

注:このプログラムはWindowsで実行されます。

+1

動的バッファサイズはどうですか? – Mysticial

+2

私はいくつかのベンチマークを実行して見ることを言います。現代のPCに1MBまたは2を割り当てることについても心配しないでください。 – drescherjm

+1

おそらく、 'mmap'を使うと助けになるかもしれません。また、Linuxには 'readahead'システムコールもあります。 –

答えて

15

IOサイズについては、http://technet.microsoft.com/en-us/library/cc938632.aspxについては何を言いますかを参照してください。基本的には、64KブロックでIOを実行する必要があります。

オン* NIXプラットフォームのstruct statには、最小IOブロックサイズを指定するst_blksizeメンバーがあります。

+1

注:このような観察された動作の根底にある理由と推奨事項は、ハードウェアによるものです。 TL; DR:*ベスト*サイズはハードウェアが提供できる最大値です。現代の "デスクトップ"コンピュータでは64Kと見られます。 –

6

大文字と小文字は大文字と小文字を区別しているため、柔軟なバッファサイズを処理できるプログラムを作成してから、最適なサイズを試してください。

バッファサイズを小さくしてからバッファサイズを増やすと、CPUがコードを実行するのにほとんどの時間を費やしているため、パフォーマンスの向上はほとんどないか、または極端に小さい一定のサイズに達します。 I/Oからのオーバーヘッドは無視できる程度になっています。

-1

私はアルゴリズムについて話すことはできませんが...メモリ使用量対プロセッサ使用量はプログラミングの古典的ジレンマであり、おそらくケースバイケースで選択する必要があります...システムに4GB RAMがある場合は、あなたは512MBしか持っていないのであれば、CPUを使うのに犠牲を払う必要はほとんどありません。最良の方法は、文法的にあなたのサイズを確認して変更することです:)

+2

これはCPU対メモリに関する質問ではありません。 –

1

メモリ管理は常に大文字と小文字を区別します。特に、ファイルI/Oと組み合わせた場合は特にそうです。

私の側から考えられる2つの提案があります。

1)固定I/Oバッファサイズを使用します。 64K、256K、512KB、または1MBです。しかしこの場合、この固定バッファーサイズを超えるI/Oがある場合は、複数の反復でI/Oを完了するためにオフセットを考慮する必要があります。

2)malloc()を使用して可変I/Oバッファサイズを使用しますが、これは特定の要因によっても異なります。あなたのシステムで利用可能なRAMや、あなたのOSでのプロセスの最大動的メモリ割り当て制限など。

0

ページサイズのバッファサイズを使用することをお勧めします。たとえば、ページサイズが4Kの場合、4Kバイトのバッファサイズを使用してコンテキストスイッチを最小限に抑えることができます。

1

これらの事項の最初のルールはベンチマークです。私の推測では、あなたは時期尚早に最適化するでしょう。実際のファイルIOを実行している場合は、通常、ディスクの帯域幅(または何か)がボトルネックになります。データをいくつかのページのまとまりで書いている限り、パフォーマンスはあまり変わってはいけません。

書き込み操作と並行してデータの部分の計算を行うことをお勧めします。このためには、2つのバッファ(現在書き込まれているものと処理しているバッファ)を保持する必要があります。次に、非同期IO機能(POSIXシステムではaio_write、おそらくWindowsのようなもの)を使用し、各反復ごとにバッファを切り替えます。

関連する問題