7-zip の圧縮方法はどれが良いの

7-zip で圧縮しようとするといくつかの圧縮方法が選べる。どれがいいのだろう。ちょっと試してみた。

用意したデータは3ファイル。

  • あるDBMSのメモリダンプ(バイナリファイル)104MB
  • メモリダンプから取り出したトレースファイル1(テキストファイル)24MB
  • メモリダンプから取り出したトレースファイル2(テキストファイル)125MB

これらを、7-zip で圧縮してみた。圧縮方法は

  • BZIP2
  • Deflate (ZIPと同じ)
  • LZMA
  • LZMA2
  • PPMd

それぞれについて標準圧縮レベル(5)と最大圧縮レベル(9)を試した。

で、生成されたファイルの圧縮率をグラフにしたのが以下。

f:id:yapud:20211114220318p:plain

BZIP2 はそこそこつぶれるけどとにかく時間がかかる。

Deflate(ZIP) はどのファイルを見ても圧縮率はイマイチ。

LZMA と LZMA2 はあまり差が見えず、テキストバイナリなどファイル形式を問わず圧縮率が非常に優秀。圧縮にかかる時間は今回試したファイル群では ZIP とほぼ同じ。LZMA を選んでおけば間違いなさそう。圧縮レベルを最大にすればさらに圧縮されるのだがそのサイズにあまり差はなくしかし時間がとてもかかるので、標準の圧縮レベルで充分だと思われる。

PPMd は圧縮対象データをとても選ぶ。パラメータの選択も難しい。似たような文字列が並ぶ、例えばログファイルのようなモノの場合は LZMA と同じくらい、ファイルによってはさらに圧縮率が高くなる。バイナリファイルやあまり規則性のないファイルに対しては圧縮率は期待できない。圧縮レベルを変えるとそれに伴い圧縮時に使用されるメモリサイズなども一緒に変化するのだが、これによっても圧縮率が変わる。複数のパラメータの組み合わせで圧縮率が変わる。少なくともZIPよりは圧縮率が高いので極端に悪いわけではない。

特筆すべきはものすごく圧縮が速いこと。今回のサンプルだと、104MBのバイナリファイルは LZMA 120秒 vs PPMd 14秒、24MBのテキストファイルは LZMA 25秒 vs PPMd 3秒、125MBのテキストファイルは LZMA 300秒 vs PPMd 12秒。圧倒的に速い。

圧縮にかかる時間は Deflate(ZIP) は LZMA と同じくらいで BZIP2 はさらに時間がかかる。あまり時間をかけてられなくてそこそこの圧縮率が欲しいときは PPMd を選べば良いのではないか。例えば数GBのログファイルをさっさとつぶしたいときなど。

最後に、コレをGUIでいちいち設定してたら手がつる。無理。コマンドラインでやろう。

Command Line Version User's Guide

Windows の場合

7zip a -m0=LZMA -mx=5 ArchiveFile.7z sourcefiles

Linux の場合

7za a -m0=LZMA -mx=5 ArchiveFile.7z sourcefiles

Linuxgzip の代わりに LZMA を使う場合

xz sourcefiles

近頃は Linux カーネルLZMA で圧縮されてたりするらしいです。