RSSフィードNo.125 「ファイル断片化を極力抑えたコピー」機能
   
日時:
2019/01/03 15:12
名前:
jack ID:yp6FgnVQ

フリーソフトのFireFileCopyやFastCopyでは、ファイルの断片化を極力抑えたコピーが行えます。この機能をDiskMirroringToolに取り入れることはできないでしょうか。動作原理ですが、例えばFastCopyでは、SetFilePointer() + SetEndOfFile() で連続領域をコピー前に確保することでファイルの断片化を防止しているようです。FireFileCopyでの動作原理は知りませんが似たようなことを行っているのだと推測します。もちろん動作速度はそれなりに遅くなりますが、断片化を抑制できる効果には換えられません。私は普段のファイルコピーにはFireFileCopyを使うことが多いですが、その理由はこのファイル断片化を抑えたコピーが可能だからです。この機能がDiskMirroringToolに備われば、最高です!

メンテ
(指定範囲表示中) もどる スレッド一覧 新規スレッド作成
4 Re: 「ファイル断片化を極力抑えたコピー」機能
   
日時:
2019/12/08 16:04
名前:
ばぐ★NAGA ID:snxGxaoA

jack さん、コメントありがとうございます。

私も処理構造を大きく変えるのは想定しておらず、
「ファイルコピー処理」に少し追加するだけのイメージで仕様を検討していました。
しかし、処理の追加自体は実現できそうなのですが、効果に疑問があったのでいったん保留にしています。

SetFilePointer + SetEndOfFile は、あらかじめコピー予定のファイルサイズ分の連続領域を確保しておいて
断片化を抑制する方法と理解しています。

例えば、100 個のファイルで 100MB の容量がある場合(1 個 1MB 程度のファイルと想定)、
100 回のファイルコピーを実行すると処理の隙間があるので断片化しやすい状態になる、と仮定します。

そこで、重いファイルコピー処理ではなく、先に 100 個・100MB の領域を SetFilePointer + SetEndOfFile という
軽い処理で確保しておくことで断片化を抑制できる、という処理方式という理解です。
まとまった領域をすばやく連続で確保するのが重要だと思っています。

ただ、この方式は DMTU では前処理をしないので実装が難しいため、個々のファイルコピー時に
SetFilePointer + SetEndOfFile を実行するようにしたらどうかと検討しましたが、
それだと結局「1 個 1MB の領域確保」→「1 ファイルコピー」を 100 回繰り返す方式になり、
「すばやく連続した領域を確保」ではなく「細切れに小さな領域を確保」という方式になってしまいます。

これだと、コピー前に余計な処理を追加するだけのことにならないか? という疑問が湧きました。
「断片化抑制」と謳えるほどの効果がなさそうに感じられたのです。

本格的に実装しようとすると、「既存ファイルがあった場合の処理」(削除してから SetFilePointer をするのか等)、
「ファイルコピーに失敗したときの処理」(SetFilePointer で作成したファイルの後始末が必要等)、
いろいろと仕様を考えなければいけないことが多いため、せっかくなら効果があることを実感できるレベルで
実装したいと思っています。

自分の理解不足で恐縮ですが、断片化抑制の仕組みが腹落ちできるまで保留とさせてください。
何か理解が進むようなヒントやサイトを教えていただけると助かります(^^;

メンテ
(指定範囲表示中) もどる スレッド一覧 新規スレッド作成
題名 スレッドをトップへソート
名前
E-mail (非表示)
パスワード (記事メンテ時に使用)
投稿キー (投稿キーを入力してください)
コメント

   クッキー保存