■ FireFileCopyとは。

ファイルをコピー(もしくは移動)するツールです。
エクスプローラで普通にファイルをコピー(移動)するのと比べ、FireFileCopyでコピー(移動)すると

などといった利点があります。

●試しに...

説明云々より、物は試しです。100MBとか200MBぐらいのファイル一つを、物理的に同じHDD中のドライブ間で「コピー」してみてください。時間も計ってください。コピー先は同じドライブでも良いですが 1台のHDD中に、論理ドライブが複数ある場合は DよりはE、EよりはFといった具合に、HDD中の物理的距離が遠いほど効果は分かりやすいと思います。

HDDがガリガリと多少なりとも音を立て(きょうびのHDDは音が殆どしないのものもありますが)、コピー作業には結構な時間がかかると思います。
これは HDDのヘッドが「Cからちょっと読み出し → Dへ書き込み → またCからちょっと読み出し → Dへ書き込み...」という動作で激しく動く(シーク動作する)ためです。だから五月蝿いし時間がかかるしで、HDD本体にもPCを操作する人間にもストレスになります。

コピーのイメージ

次に FireFileCopyを使って同じコピー作業をしてみます。バッファサイズは 30MBぐらいは確保したいです。(→必要条件) するとコピー作業は速く、そして極めて平穏に行われたと思います。これが FireFileCopyの効果です。
効果が分かりにくい場合は「FAQ」をご覧ください。またExplorerでは、OSのディスクキャッシュが効いているため、当然2度目以降のアクセスが早くなり、ちゃんとした比較ができませんので、OSを再起動するなどしてキャッシュをクリアして比較してください。


●バッファ

通常、ファイルの読み書きは「バッファ」というメモリを介して行われます。例えば、安易な例えで申し訳ないですが風呂桶の水20Lを洗濯機にポンプを使わず移すことを想像すると良いでしょう。これを0.2Lしか入らないコップでやったら、100回も汲んでは捨てを繰り返さなければなりません。そこで5L入るバケツを使うと4回で済み、効率が良いわけです。このコップやバケツがバッファに相当します。

バッファは OSが物理メモリ上に確保するもの、HDD自体に備わっているものなどがあり、見かけ上のパフォーマンスを改善するのに大きく役立っています。が、しかし、

大きなファイルのコピーや、それほどサイズは大きくなくとも、沢山のファイルをコピーするときなどは、こういったバッファの効果は、劇的に落ちてしまう場合があります。

なぜならばバッファのサイズが、一度に操作するファイルのサイズに対して、小さい事が多いからです。 例えばOSのバッファが 1MBで、100MBのファイル×1個を、あるいは1MBのファイル×100個、Cドライブから Dドライブにコピーしたいとします。 このためには HDDのヘッドは、読み書きのために 100回もディスク上を往復移動しなければなりません。(実際はHDD側にもバッファがあるため、これよりは少なくなる)

だから、いくらシーク速度が速い HDDでも、速度も落ちるし「ガガガガ...」と大きな音も出るのです。これでは Ultra ATAなどの高速転送も十分生かされません。

バッファが小さいと...

●FireFileCopyは何をしているのか

−大容量バッファ

物理メモリを大量に確保し、これを大容量バッファとして使って作業を行います。空き物理メモリが 50MBあれば、最大約 50MBをバッファとして確保できます。40MB確保したとすると、総計100MBのコピー作業でも HDDヘッドの大きな移動は3回で済み、HDDのシークに伴う速度低下、及び HDDの負担が大幅に低減されます。

バッファを大きくする

Windowsでは遅延書き込み&ディスクキャッシュの仕組みにより、書き込みデータのバッファリングもある程度は行います。 実際、メモリを多く積んだマシンではファイルのコピーなどが、FireFileCopyを使ったとき〜までとはいきませんが、かなり高速で静かになることがありますが、このような動作が常に保証されているわけではなく、環境やそのときのメモリ状況・システム負荷状況により挙動が変わります。更にコピーするファイル容量により、数10MBぐらいまでのファイルならキャッシュシステムが効率よく効きますが、100MB〜 GBオーダーのファイル、あるいは何百、何千といったファイルのコピーなどになると、パフォーマンスが落ちる場合があります。

最近のWindowsではかなり改善されてきたようですが、READ時に確保されたディスクキャッシュはなかなか開放されず、肝心の、OSやアプリケーション用のメモリを圧迫したり、WEITE時にはバッファリングのために空きメモリを食い尽くしてしまい、ファイルコピー時にOSが重くなるというのもよくある話です。Win9xの頃はシステムモニタやパフォーマンスモニタなどで観察すると、空きメモリがどんどんキャッシュに食われていくのが分かり、“メモリを意味なく食う”という理由からディスクキャッシュの容量に制限を掛けるというチューンアップは常套手段でした。

FireFileCopyはバッファを、必要な時だけ、明示的に利用するアプリケーションです。


−大きなI/O要求

大容量バッファのデータは一塊のREAD/WRITE要求としてOSに渡すわけではなく、READ→READ→READ→WRITE→WRITE→WRITEといった具合に、ある程度の大きさに分割されます。この分割が細かすぎると、それだけOSの処理を呼び出すオーバヘッドが発生し、スループットが落ちます。逆に大きすぎる(あるいは全く分割しない)と、転送速度や残り時間などのモニタ用データの計測間隔が長くなり、表示上の都合が悪いという点と、READ/WRITE操作がエラーとなる確率が高くなる点(これは「リソース不足」というエラーメッセージとなって通知されます)が問題となります。Explorer(特にVistaより前の世代のWindows)の処理はどちらかというと前者に近く、スループットが向上しない要因になっていました。

最適なI/Oサイズ(必要以上に細かすぎず、モニタデータの更新がそこそこ可能な程度の大きさ)は、デバイスの種別や転送速度によって変わってきますが、FireFileCopyではデバイス種別や処理優先度、同一/別ドライブの違いに応じ、I/Oサイズを適切に調整し、スループットの向上を図っています。


−非キャッシュI/O

Windows標準のファイルコピーは、ディスクキャッシュを介して行われます。 しかし転送元から1回読んで、転送先に1回書くだけのファイルコピー処理においては、あまり恩恵がない上、あまり必要のないデータがディスクキャッシュに溜まってしまい、一般アプリケーションが使用していた有用なデータがキャッシュから追い出されてしまう可能性もあります。更にキャッシュを使用するコピーは、メモリ←→メモリのデータ転送(CPUが介在する)が多くなります。このため、コピー中・コピー後にOSが重くなっと感じる場合があります

一方、キャッシュを介さないコピーでは、固定で確保したバッファ以外のメモリは殆ど消費しませんし、メモリ←→ディスク間のデータ転送(通常CPUを使わずDMA転送される)が中心となるため、CPU負荷も大変軽く、スループットの高い転送が可能となります。ただし容量の小さなファイルを大量に非キャッシュコピーすると、細切れのディスクWRITEが多く発生するため逆に遅くなる事があります。この場合はキャッシュを使ったほうが速くなります。(データの総サイズが小さいのでCPU負荷としても高が知れている)

FireFileCopyは非キャッシュI/Oを基本とし、処理するファイルサイズや物理メディアに応じライト側キャッシュ/非キャッシュを効果的に使い分けることで、高速かつ低負荷なコピーを実現します。


FireFileCopyによるコピー処理のポイントを概念的に示したものを以下の図にまとめます。

高速化とデータの流れ

更に物理的に異なるドライブ・ネットワーク間の転送を効率的に行うための方法として以下があります。

−非同期R/W

同一ドライブ間コピーの場合は、READとWRITEを交互に行う(同期R/W)のが一番効率が良いですが、別ドライブ間コピーの場合は、READとWEITEを並行して行う(非同期R/W)方が、無駄な待ち時間がなく効率の良い転送ができます。

FireFileCopyでは上記にあるような大容量バッファと大きなI/O要求を生かし、大きなファイル転送から多数の細かなファイル転送まで様々な状況において、転送速度が遅い側の能力をフルに引き出す(無駄なアイドル時間を削減するように)設計されています。


●参考

手近なところで計ってみました。
(FireFileCopy v1.0.0 による。細かいファイルの処理速度はその後のバージョンで更に上がっています。昔の計測結果ですのでファイルサイズがこの程度だと、きょうびのシステムでは対して差がでない可能性もあります)

実際の効果

短縮率は環境によって異なりますが FireFileCopyを使うと大幅に処理時間が短縮されるのがお分かりいただけると思います。
CASE2の Win95では、HDD中の位置が物理的に遠い、Cドライブから Hドライブにコピーしています。この場合、HDDヘッドの移動が大幅に削減され、コピー時間が激減していることが分かります。HDDのシーク音もほとんど出ません。

なお、このような比較を行う場合、OSを再起動するなどしてディスクキャッシュをクリアして比較を行わないといけないのでご注意ください。


<<目次へ戻る