gzip/bzip2/xz/brotliなどをいろんなデータとオプションでテストしてみたな記事はよく見るので、「そういうのはいいからもっと突っ込んだ話を」な目的でまとめてブログのネタにしようと思って下調べしてたら、かなりしっかりした記事を見つけた。
・ 2016年のOSS圧縮ツール選択カタログ
圧縮・解凍をただのツールとみなさずに目的別に書いてたりするあたりもよい。こういうのが欲しかったんだよ、10日ほど前に書かれたほやほやの記事。
上記の記事がちゃんと書かれているので重複になっちゃうけど、私として目的や存在意義で強調しておきたいのはこのへん。
● 保存目的
保存目的とは、容量の少ないメディアにできるだけ詰め込みたい、圧縮は1回きりでネットなどで公開しその後DLしたたくさんの人がそれぞれ解凍する(解凍は何度も行われる)、というようなもの。保存目的の場合、圧縮にかかる時間は無視して、圧縮率と解凍速度が求められる。今はxzやbrotliが最適。
● リアルタイム目的
リアルタイム目的とは、要求が来てから圧縮・転送・解凍が行われるもの。ネットワーク越しの転送(HTTP)とか、機器内部のバスのデータ転送とかが当てはまる。すべての速さと圧縮率のバランスが求められるため、ネットワーク・バスの転送速度と圧縮・解凍にさけるリソース(端的にはCPUとRAM)により最適なものが変わる。また転送されるものがあらかじめ予測できる場合は圧縮だけ事前にやっておくことが可能、Apacheが「.html.gz」なファイルを転送する場合、ブートローダがLinuxKernelをストレージから読む場合などが該当する。
● マルチコア対応
「最近のパソコンはCPUコアたくさんあるんだから並列スレッド処理しようよ」の思想で、マルチスレッド対応して高速化対応したものが出てきている。ファイルに保存したりデータ転送したりしないといけないからデータ形式は既存のものと互換保とうとしているので、逆に置き換えをしやすい。このへんドゾ。
pigzで圧縮を並列処理して高速化
「マルトスレッド処理に適した新しいデータ形式」が出て来る可能性もあるけど、そこまでがんばる以前に、世の中のマルチコアCPUの環境違いで何が最適なのかが見えてこない。デュアルXeonでCPUいくらでも使えるならpixzでいいけど、だいたいの人はCPUコア2個か4個くらいだし、とか。
● 汎用性
世の中必ずしも最先端を全力で追える開発ばかりではない。フットプリント(プログラムの大きさ)、RAM使用量、移植性の高さ、バグのなさ、ハードウェアアクセラレータが使える、なんかもターゲットによっては重要な要因になる。未だにzlibが大人気なのもこのあたりが理由と思われる。
個人的には、zlib互換のライブラリがあるというのを上記の記事で知れたのがよかったかなぁと。ぜひテスト・評価してみたいです。