ファイルコピーの際のバッファサイズ – プログラミング – Home

ファイルコピーの際のバッファサイズ
 
通知
すべてクリア

[解決済] ファイルコピーの際のバッファサイズ


bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
Topic starter  

毎度、お世話になっております。

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

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

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

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


引用未解決
トピックタグ
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
Topic starter  

修正です。

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

1024KByte


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

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

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

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


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
Topic starter  

たいちうさん、ありがとうございます。

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

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


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

「CMemFile」を使うといいかもしれません。
最後、ファイルに書込まなければいけませんが、これなら100MB位はいいはずです。


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

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

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

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


返信引用
tera
 tera
(@tera)
ゲスト
結合: 18年前
投稿: 24
 

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


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
Topic starter  

みなさん、どうもです。

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました