毎度、お世話になっております。
ファイルをコピーするアプリケ-ションを作っており、最初は WinAPIの
CopyFile()
を使って、コピーしていたのですが、
ファイルの排他処理が必要になり、
CStdioFile::Read(), CStdioFile::Write()
でコピーするように修正しました。
その際、Readバッファのサイズ指定がありますが、いくつがいいのか分からな
いので、いろいろ試してみました。
16KByte - なんとなくこんなもんかな?実際に調子良い。
1Byte - 正常動作するが、16KByteのときより遅い
160KByte - 16KByteのときとほぼ同じ速度かな?
1024MByte - Stack OverFlow (バッファをローカル変数にしたせい?)
以上の結果より、数10KByteから数100KByteぐらいが良いかなと思いますが、
何らかの指標というのがあるものなのでしょうか?
よろしくお願いいたします。
修正です。
1024MByte - Stack OverFlow (バッファをローカル変数にしたせい?)
↓
1024KByte
まず、扱うファイルのサイズの分布によるでしょう。
後、マシンスペックと、どの位処理速度が重要かによって、
丁寧に標準サイズを決めるのではないかと。
スタックのサイズなんか、
「プロジェクトのプロパティ」→「リンカ」→「システム」→「スタックサイズの設定」
で変えても良いし。
# VC6の時のデフォルトのサイズは1MBだったと思うけど、最近はどうなのかな。
# 今時のPCで私が適当に汎用的に作るなら、キリが良いところで、
# 1MBとか10MBとかにするかな。
たいちうさん、ありがとうございます。
Stack OverFlowはやはりローカル変数だからでした。
バッファを new で確保するようにしたら、100MByte単位でも大丈夫でした。
そして、1GByteはいわゆるメモリ不足エラーでした。
もし、バッファサイズの明確な指標が無ければ、
実験結果では、10KByte ~ 10MByteぐらいが最速で、それ以上もそれ以下も速
度低下が見られましたので、間をとって、1Mbyteぐらいで行こうと思います。
「CMemFile」を使うといいかもしれません。
最後、ファイルに書込まなければいけませんが、これなら100MB位はいいはずです。
> もし、バッファサイズの明確な指標が無ければ、
> 実験結果では、10KByte ~ 10MByteぐらいが最速で、それ以上もそれ以下も速
> 度低下が見られましたので、間をとって、1Mbyteぐらいで行こうと思います。
シビアな話でないならば、とりあえずは1MBでいいんじゃないですか。
近い将来、ハードウェア、OS、フレームワーク、扱うファイルサイズ等が変わった時に
今回の実験結果が当てにならないかもしれない、ということだけ気をつけてください。
VCではたしかデフォルトは1Mです。
ヒープ領域のサイズはあんまり変更はお勧めは出来ませんが…(^^;)
みなさん、どうもです。
特に明確な指標があるわけではなさそうなので、
実験結果、みなさんのお勧めが一致する 1MByteで行くことにします。
ありがとうございました。