結論
なんでもかんでもzip圧縮すればよいというわけではないということ。
スパースファイルなら、そのままの方がディスクを食わない場合もある。
きっかけ
NTFS圧縮のススメという記事を書いてみて、ふと仮想化ソフトウェアのディスクイメージって、スパースなんじゃないか?
となると、zip圧縮した方がディスク食うんではないか?
とか疑問を感じたので、実際に試してみた。
準備
まずはツールを作った(作らなくてもどっかに転がっていそうだけど、作れるものは作ってみたいんですよ~)。
シンプルに Win32API の GetFileSize() と GetCompressedFileSize() を表示するだけ。
スパースファイルの作成は・・・作れなかったまで、fsutilコマンドで行った。
実験結果
NTFS圧縮
まずはシンプルにNTFS圧縮の場合。
4MBぐらいのbitmapファイルを対象にする。
NTFS圧縮されたファイルは、既定の設定だと、ファイル名は青くなる
まぁ、こんな感じで、圧縮されてディスクに格納されるのが、NTFS圧縮。
スパースファイル
見よう見まねでスパースファイルを作ってみる
最初のスパース前は、ファイルサイズと同じだけディスクを食っていたけど、スパースにしたら、ゼロになった。
スパースファイルをzip圧縮してみる
次は、そのスパースファイルをエクスプローラのzip圧縮をしてみる
まぁ、当たり前だな。スパースでディスクを節約していたのに、圧縮処理(データのランダム化の一種)によって、スパースの効果がなくなっているって事だな。
つまり、スパースファイルをzip圧縮すると、ディスクの節約になるかもしれないし、ディスクの節約どころか無駄使いになるかもしれない
スパースファイルをNTFS圧縮してみる
NTFS圧縮サイコー!!
スパースファイルをNTFS圧縮しても、スパースの効果は失われないって事だな。
代替ストリームと GetCompressedFileSize() の関係
ふと、気になったので・・・・
あ、こんなツールも作っていたよ。ZoneID を復活するスクリプト
とりあえず、代替ストリーム活用の代表がこれ(ゾーン情報)だと思う。
関係ないようだ・・・GetFileSize() と GetCompressedFileSize() の違いで既定以外の代替ストリームがあるとかないとかは分からないという事だな。