ファイルコピーの際のバッファサイズ

[戻る]
bun 2008/04/30(水) 11:59:03
毎度、お世話になっております。

ファイルをコピーするアプリケ-ションを作っており、最初は WinAPIの
  CopyFile()
を使って、コピーしていたのですが、
ファイルの排他処理が必要になり、
  CStdioFile::Read(), CStdioFile::Write()
でコピーするように修正しました。

その際、Readバッファのサイズ指定がありますが、いくつがいいのか分からな
いので、いろいろ試してみました。
  16KByte - なんとなくこんなもんかな?実際に調子良い。
    1Byte - 正常動作するが、16KByteのときより遅い
 160KByte - 16KByteのときとほぼ同じ速度かな?
1024MByte - Stack OverFlow (バッファをローカル変数にしたせい?)

以上の結果より、数10KByteから数100KByteぐらいが良いかなと思いますが、
何らかの指標というのがあるものなのでしょうか?

よろしくお願いいたします。

bun 2008/04/30(水) 12:14:25
修正です。

1024MByte - Stack OverFlow (バッファをローカル変数にしたせい?)
  ↓
1024KByte

たいちう 2008/04/30(水) 13:11:04
まず、扱うファイルのサイズの分布によるでしょう。
後、マシンスペックと、どの位処理速度が重要かによって、
丁寧に標準サイズを決めるのではないかと。

スタックのサイズなんか、
「プロジェクトのプロパティ」→「リンカ」→「システム」→「スタックサイズの設定」
で変えても良いし。

# VC6の時のデフォルトのサイズは1MBだったと思うけど、最近はどうなのかな。
# 今時のPCで私が適当に汎用的に作るなら、キリが良いところで、
# 1MBとか10MBとかにするかな。

bun 2008/04/30(水) 15:22:35
たいちうさん、ありがとうございます。

Stack OverFlowはやはりローカル変数だからでした。
バッファを new で確保するようにしたら、100MByte単位でも大丈夫でした。
そして、1GByteはいわゆるメモリ不足エラーでした。

もし、バッファサイズの明確な指標が無ければ、
実験結果では、10KByte 〜 10MByteぐらいが最速で、それ以上もそれ以下も速
度低下が見られましたので、間をとって、1Mbyteぐらいで行こうと思います。

ITO 2008/04/30(水) 15:50:05
「CMemFile」を使うといいかもしれません。
最後、ファイルに書込まなければいけませんが、これなら100MB位はいいはずです。

たいちう 2008/04/30(水) 16:21:02
> もし、バッファサイズの明確な指標が無ければ、
> 実験結果では、10KByte 〜 10MByteぐらいが最速で、それ以上もそれ以下も速
> 度低下が見られましたので、間をとって、1Mbyteぐらいで行こうと思います。

シビアな話でないならば、とりあえずは1MBでいいんじゃないですか。

近い将来、ハードウェア、OS、フレームワーク、扱うファイルサイズ等が変わった時に
今回の実験結果が当てにならないかもしれない、ということだけ気をつけてください。

tera 2008/04/30(水) 20:14:43
VCではたしかデフォルトは1Mです。
ヒープ領域のサイズはあんまり変更はお勧めは出来ませんが…(^^;)

bun 2008/04/30(水) 23:15:46
[[解決]]
みなさん、どうもです。

特に明確な指標があるわけではなさそうなので、
実験結果、みなさんのお勧めが一致する 1MByteで行くことにします。

ありがとうございました。

古いスレッドには追加発言できません。