[23261]  ファイルコピーについて
投稿者:くん さん   2002-08-05 21:04:44
ちょっと気になったので質問させてくださいませ。
1.エクスプローラで5つファイルを選択してコピー => 貼り付け
2.エクスプローラで1つファイルを選択してコピー => 貼り付け x 5(前のが消えてから次を)
3.エクスプローラで1つファイルを選択してコピー => 貼り付け x 5(前のが消える前に次も)
4.Copyコマンドを連続で書いたバッチファイルを実行(コマンドプロンプト)
5.CopyFile APIを使ったファイルコピーを繰り返し文で繰り返すプログラム
これらって断片化の具合や総合的な書込速度や一時的なメモリ消費量等の違いはどうだと思われますか。
個人的には1、2は同じで3はなんか重くなっている気がするのですが、4、5との違いはあるのでしょうか、
また4番みたいなバッチ処理の場合、WindowsのコマンドプロンプトとかとDOSでは制御の戻り方とかが違うんでしたっけ??

というのもCD-RWやDVD-RAMといったメディアに大量のファイルを同時に選択してコピーすると
すさまじい遅延書き込みでメモリが消費されて足りなくなりスワップ行きで動作が重くなるので、
現在メモリ量と相談しながら少しずつコピーしている効率の悪い状態でして気になりました。
HDD=>HDDだったら読込と書込の速度差が小さいし気にする必要はないのですがDVD-RAMは特に…(^^;)

とりあえずタイマーで空きメモリ量を監視しながら適度にコピー仕掛けるだけの単純なプログラムでも
自分用に作ろうと思ったんですが、その前に気になったので質問させていただきました。
どうぞよろしくお願いいたします。
  1. WELLNOW さん   2002-08-05 21:29:35
    リソースを取るという視点で見ると、
     普通なら1.が最も取るのではないかと思いますが。同様に5.もプログラムの構造次第では、全部Bufferに実行時にどんどん取り込んでしまう可能性があります。
     たとえば、File管理ソフトで、GF95やFilmtn for Win等使って、複数ファイルを選択してコピーすると、コピーしただけ結果的にリソースを食っています。こういうとき私は、メモリ管理ツールのMemTurbo2で、メモリリカバリを自動実行して、リソース不足にならないようにしています。
     私もDVD-RAMにシステムやデータのバックアップやリストアをしていますが、取り立ててメモリリソース不足で困ると言うことは、この方法ではないです。速度はデバイス律則、安定性はそのままです。
     ファイルをコピーして、リソースが不足するという状態でお困りなら、手動でファイルキャッシュを制限して、一定以上リソース不足にさせない方法もあります。

    SYSTEM.INIで[Vcache]セクションで
    MinFileCache=8192
    MaxFileCashe=16384
    等と記述すれば、最低8MByte、最大16MByteのメモリしかディスクキャッシュに使用されません。この設定例はWindows9x系のものですが。
  2. WELLNOW さん   2002-08-05 21:43:46
    ちなみに、Windows9x系では、普段は仮想ファイルを使わない設定にしています。その分大量にメモリを積んでいますので、Memturbo2でメモリリカバリとは、使っていないメモリを未使用メモリ(空きメモリ)として再生させることを言っています(スワップアウトはメモリスクラブと言っています)。
  3. くん さん   2002-08-05 21:44:33
    WELLNOWさんどうもありがとうございます。
    Win9xではVCache指定はしておりましたが現在はWin2000での話です。
    OSを書き忘れていて申し訳ありません。
    HKEY_LOCAL_MACHINESystemCurrentConrtolSetCotrolSessionManagerMemory ManagementIoPageLockLimit
    の制限他、窓の手でできる事位しかしていないのですが他に何をいじればよいでしょうか?
    本来ライトキャッシュを切って遅延書き込みをやめてしまえばいいのかもしれませんが…(^^;)
  4. McBenie さん   2002-08-05 23:17:26
    エクスプローラで大量のコピーは危ない、という事を聞いたような気がします。
    すみません、はっきりしなくて(^^ゞ

    1は2の動作を自動的にやってくれてるのと同じことじゃないかな〜?
    "選択してコピー"はただ単に選択したファイルのリストをOLEへ渡してるだけ。
    "貼り付け"を実行して初めてコピー処理(SHFileOperation APIだと思いますが)する。
    3は"前のコピー処理"と"次のコピー処理"が同時に行われているので
    重くなっているように思うのですが・・・。

    自作するんだったら、CreateFile,ReadFile,WriteFile等を使って
    いちから作ってみるのが一番いいのでは? バッファのサイズ自分で決めれるし、
    OSのキャッシュとかバッファリングを無視する処理もできるし(ちとあぶない気も(^^ゞ
  5. くん さん   2002-08-06 02:51:56
    McBenieさんありがとうございます〜。
    確かにおっしゃる通り、貼り付けはSHFileOperation APIだと思います(^^;)
    3の場合別スレッドで並行して同時に書き込むから重いのだと思うのですが、
    4とかの場合、バッチの制御って書き込み完了を感知して次、にならないで
    3と同様になるのかな〜と思ってしまった次第でした。バッチファイルの挙動って
    DOSとWindowsのDOS窓でやや違うという話をどこかで聞いたような気がしたもので(^^;)

    しかし確かにCopyFile APIなんか使ってコピーツール作ったとしても、
    1ファイルサイズが空きメモリ量を上回っている場合には無意味ですしね(^^;)
    やはり自分でバッファリングしながら書き込みするソフト作ってみようと思います。
    どうもありがとうございます。
  6. WELLNOW さん   2002-08-06 22:54:44
    >バッチファイルの挙動ってDOSとWindowsのDOS窓でやや違う
     仮想86モードでのCPUのメモリ管理(処理)と、すっぴんリアルモードでは異なりますね。リアルモードではHMAはサポートされませんし。
     ただ、データのコピー(全容量1GByte位の大量のファイル)を、MS-DOSプロンプト・コピーする実験をしたところ、リソースメーターでは、一定のリソース変化(MS-DOSプロンプト消費分)のまま、つつがなくコピーを終えてしまいました。これは、
    >バッチの制御って書き込み完了を感知して次
    というより、元々のMS-DOSプロンプトのPif設定のメモリ消費以上のファイルは、Bufferに入らないので、マルチスレッドで割り当てられているMS-DOSプロンプト時間で転送しているのでは無いでしょうか。
     基本的にBatch Fileは、1つ1つの命令をシェル上で順序に従って実行していくもので、一回の命令につきBuffersをあふれるあふれないにかかわらず、決められたメモリのみ消費し実行するのだと思われます。