データのバックアップと復元のスピード

データのバックアップを取ったり、復元するときの効率について考えてみた。
ハードディスクAから別のハードディスクBへサイズがxのデータをコピーし、その後ハードディスクBからさらに別のハードディスクCへそのデータをコピーすることについて考えてみる。
このときのハードディスクの読み書きするサイズは、
A->Bへのコピーのときはxだけ読み込んでxだけ書き込むので2x,
B->Cへのコピーのときも同様に2xとなる。
合計で4xの大きさの分だけハードディスクを読み書きする。

ここでA->Bへデータを圧縮して書き込み、B->Cへデータを解凍して書き込む場合について考えてみる。
圧縮率がcのとき、A->Bへデータを圧縮して書き込むときの
ハードディスクAから読み込むデータサイズはx、ハードディスクBへ書き込むデータサイズはcxとなる。
次にB->Cへデータを解凍して書き込むときは
ハードディスクBから読み込むデータサイズはcx、ハードディスクCへ書き込むデータサイズはxとなる。
合計で2x+2cx=2(1+c)xだけハードディスクを読み書きすることになる。

ここで圧縮してデータをコピーするときのハードディスクへのアクセス量が、圧縮しないときのアクセス量より小さくなるにはr<1であればよいことがわかる。
非圧縮コピー時のアクセス量に対する圧縮コピー時のアクセス量の比率rは
r=(2(1+c)x)/4x=(1+c)/2
となる。
例えば圧縮率が3/4だとr=7/8
1/2だとr=3/4
1/4だとr=5/8
1/8だとr=9/16
...
c=0のとき、r=1/2だから、圧縮率をどれだけよくしても総ハードディスク読み書き量は半分以下にはならない。


現代の普通のPCではハードディスクの読み書き速度はCPUやメモリの速度よりかなり遅いので、このようなバックアップ時はハードディスクのアクセスが大きなボトルネックとなる。だから、CPUやメモリをある程度使って圧縮、解凍処理を行い、ハードディスクのアクセス量を減らすと効率が良くなる。

ちなみにいくつかの方法で82MBぐらいのデータを別のハードディスクへコピーしたときの所要時間は以下のようになった。
実験ではCPUがcore2duoT5500、メモリが2GB、windows vistaのマシンを使い、SATAの内臓ハードディスクを外付けケースに入れてUSBで繋いだものから別のUSB接続の外付けハードディスクへのコピーを行った。
windows vistaのシェルで普通にコピペ->110秒(これには所要時間を計算する時間も含まれている)
cygwinからtar+bz2で圧縮してコピー->34秒
cygwinからtar+gzで圧縮してコピー->16秒
http://www.ipmsg.org/tools/fastcopy.html
にあるfastcopyというフリーソフトを使った場合
コピー(全上書き)モードでバッファサイズが128MBで->87秒

ちなみに使用したデータを
tar+bz2で圧縮したとき21MB(c=0.26, r=0.63, 34秒/87秒=0.39)
tar+gzで圧縮したとき24MB(c=0.30, r=0.65, 16秒/87秒=0.18)

この実験では、まだデータを解凍してコピーするときの処理時間の計測はしてない。
やはり圧縮したほうがかなり速い。データの書き込むサイズの減った割合に対して所要時間の減り方が大き過ぎるような気がする。これはどこかで実験方法を間違えたか、ハードディスクにあるキャッシュがかなり効いているためなのか。圧縮率がいいのに所要時間がgzipより長いbzip2はさすがにCPUにかなり負担がかかるようだ。

災害は突然忘れた頃にやって来るので常にデータをバックアップするようにしましょう。