16

私の関数では、ファイルからバッファにデータを読み取り、データを操作して別のファイルに書き戻す必要があります。ファイルのサイズは不明で、非常に大きい可能性があります。

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

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

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

4

6 に答える 6

25

IO サイズに関する Microsoft の見解を参照してください: http://technet.microsoft.com/en-us/library/cc938632.aspx。基本的に、おそらく 64K ブロックで IO を実行する必要があると言われています。

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

于 2013-03-21T06:22:32.920 に答える
6

実際、これは大文字と小文字に大きく依存するため、柔軟なバッファー サイズを処理できるようにプログラムを作成してから、最適なサイズを試してみてください。

小さいサイズから始めてバッファ サイズを大きくすると、CPU がほとんどの時間をコードの実行に費やして、I /O は無視できるようになりました。

于 2013-03-21T06:21:33.110 に答える
2

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

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

于 2013-03-21T06:52:53.460 に答える
1

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

私からの提案は 2 つあります。

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

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

于 2013-03-21T06:30:24.323 に答える
0

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

于 2013-03-21T06:43:50.693 に答える
-2

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

于 2013-03-21T06:22:02.003 に答える