7z形式のよいところ

職場でテキストデータをZIPに圧縮していて思ったより減らないなと。

圧縮後のサイズに特に意味は無いのだが……

それで何を思ったのか7zで圧縮したら、ケタ違いに小さなサイズになってびっくり。


職場ではファイル圧縮・展開ツールとして7-Zipを標準ソフトとして採用している。

世間的にも7-Zipが使われることが多くなってるみたいね。

プライベートでも以前使っていたLhazの陳腐化から7-Zipに乗り換えている。

7-Zipというと独自の高圧縮形式「7z」の印象が強かったのだが、

実はZIP形式でもメリットが大きいソフトだと言われている。

というのも7-ZipはZIPで一般に使われているDeflateの圧縮率でも優秀なのだ。

普段は専らZIPのために使う7-Zipだが、当然7z形式も使うことができる。

なので意味も無く7z形式で圧縮してみたら小さくなったと。


7z形式が高圧縮である理由としてよく言われるのがアルゴリズムの違いである。

7zで一般に使われるLZMAは、ZIPで一般的に使われるDeflateより高圧縮だから。

展開の性能ばかりよいLZMA、Linuxに来る

これはLinuxのソースコードをtarballで圧縮した場合の話で、

gzip(=Deflate)で73Mbyteだったものが、LZMAだと48Mbyteになると。

しかし、7z形式でケタ違いに小さくなった主因はそこではない。

調べてみると7z形式の特徴として書かれている「ソリッド圧縮」が効いてるらしい


ここで初めて知ったのだが、ZIPというのはファイル単位で圧縮して結合しているに過ぎないらしい。

なので類似するファイルを複数圧縮しても、1個あたりのサイズは減らない。

一方、Linuxなどでよく使われるtarballというのはファイルをtarで固めて、

その後に何らかの圧縮アルゴリズムを適用するという方法を取っている。

この方法では類似する複数のファイルをtarに固めて圧縮すると、1個あたりのサイズは小さくなる。

ただし、ファイル一覧の確認のためにtarball全体の圧縮を解除しなければならないなどの欠点はある。


7z形式はこれの良いところ取りができるようになっている。

標準設定ではソリッド圧縮が4GBとかで有効になっていて、

4GBを上限に複数ファイルを結合してから圧縮アルゴリズムにかける。

このサイズを小さくすれば部分展開時に余分に展開するサイズを小さく出来る。

あと7z形式ではヘッダを圧縮して格納する機能があり、ファイル一覧などもその部分だけで圧縮を行う。

ZIPではこの部分は無圧縮、tarballでは本体といっしょくたに圧縮されるが、

7z形式ではヘッダへのアクセス容易性とサイズ削減が両立できるわけである。


というわけでいくつか実験してみた。

7z形式というと標準の圧縮アルゴリズムはLZMAだが、Deflateも選択可能である。

ただし、7-ZipのGUI上では選択できず、コマンドラインでないと使えない。

>7z a -mm=Deflate:fb=32:pass=1 def.7z datas\
>7z a -mm=LZMA2:d=16m:fb=32:mf=bt4 –ms- lzma_nonsolid.7z datas\

7zってのは7-Zipのインストール先にある7z.exeのこと。

-mm=でアルゴリズムの指定ができて、Deflateも選べると。

-ms- ってのがソリッド圧縮の無効化ですね。-ms=offとも書ける。

この結果、こんな感じになった。

  • Deflate・ソリッド圧縮無効: 349kB
  • Deflate・ソリッド圧縮有効: 200kB
  • LZMA2・ソリッド圧縮無効: 325kB
  • LZMA2・ソリッド圧縮有効: 61kB

ソリッド圧縮を使わない場合、DeflateとLZMA2の差はそこまで大きくない。

これをソリッド圧縮有効にすると、同じDeflateでも6割ほどに減る。

DeflateとLZMAのアルゴリズムの差よりソリッド圧縮の効果の方が大きい。

しかし驚くべきところはLZMAでソリッド圧縮有効にすると2割にも圧縮できた。

この結果、ケタ違いに軽くなったということである。


仕組みが同じならば同じようなサイズになると言える。

Deflateの設定を合わせてZIPで圧縮すれば365kBである。

7z形式でDeflate・ソリッド圧縮無効より若干大きい程度である。

LZMAで圧縮されたtarball(.tar.xz)で、LZMAの設定をさっきと似たようなところにすると61kBとなった。

7z形式でLZMA2・ソリッド圧縮有効にしたときの数字とほぼ同じだった。


社内では7-Zipが標準なんだし、7z形式をもっと活用してもよいのでは?

と思わなくもないけど、なかなかそういう機運は乏しい気がする。

1つは容量に対してそこまでシビアでないこと。

もう1つはWindowsの圧縮フォルダ機能で展開する人がけっこういるということである。

標準だと関連付けが圧縮フォルダになっているので。

関連付けを変更したり、あえて7-Zipで開く動作をすればよいのだが、全員がやっているわけでもない。


ということに気づいた理由がZIPの暗号化アルゴリズムなのだが。

パスワード付きのZIPファイルは社内での文書配布に使われることがある。

配布する文書が「社外秘」より厳しい「関係者外秘」にあたるということで、

都合によりそれより広いアクセス範囲のファイル置場に置く場合は、

パスワード付きのZIPにして、対象者にE-mailでパスワードを送るということがある。

なぜアクセス範囲の広い置場を使うのかというと、部署外の関係者にも配布するから。

(部署内での情報共有は厳密にアクセス権が管理された置場を使っている)

元々、部署外に配布する文書なのだから、社内であれば大した話でもないと思われ、

なので、パスワード保護というのは気休めみたいなもんですよね。


で、このパスワード付きのZIPを作るときに7-Zipでは「ZipCrypto」と「AES-256」が選択できる。

ZipCryptoが標準とされているが、暗号強度が弱いことも知られている。

AES-256を使えば多少強固かと、こちらを選んでパスワードをかけた。

そしたら、展開できないのだがという問い合わせが数件来た。

7-Zip使えばいけると思うけどと返したのだが……

これは7-Zipを使っていない人が社内にもけっこういることを表している。


社内ですらこれだから、社外となればなおさらでしょう。

伝統的なZIPでないとなかなか使えないのが実情ではないか。

7z形式も7-Zip独自形式というわけではないが、他の対応ソフトは限られる。

しかし、7z形式の長所というのはここまで書いた通りで、LZMA以外の点でもよいところはある。

そこまでする必要は特にないという話でもあるかも知れないが。