はじめに
zip、gzip、Bzip2、Snappy、Zstd、Brotli などなどなど...
この世には数多のファイル圧縮形式が存在しますが、どれを使うべきか迷うことはありませんか?
それぞれどんな特徴があり、どんな場面で使うのが適しているのか。
そんな疑問に答えるため、ファイル圧縮形式の種類とそれぞれの特徴をまとめてみました。
コマンドチートシートは別記事にまとめました。
サクッとコマンドを確認したい方は、以下のリンクからご覧ください。
- はじめに
- まずは簡単まとめ
- ファイル圧縮とは
- 主要な圧縮形式の特徴・用途・使用アルゴリズム
- 実際に CSV ファイルを使って「圧縮率、圧縮・解凍時間比較表」を比較してみる
- さいごに
- (おまけ) 圧縮アルゴリズム一覧表
まずは簡単まとめ
以下の表は、主要な圧縮形式の特徴を簡潔にまとめたものです。
圧縮率、圧縮速度、解凍速度、互換性の4つの観点から、各形式の特徴を示しています。
圧縮形式 | 圧縮率 | 圧縮速度 | 解凍速度 | 互換性 | 特徴 |
---|---|---|---|---|---|
tar | - | - | - | - | 単なるアーカイブ形式で、圧縮は行わない。 他の圧縮形式と組み合わせて使用されることが多い。 |
zip | ⚪︎ | ⚪︎ | ◎ | ◎ | 最も普及している形式。 複数ファイルのアーカイブやパスワード保護が可能。 |
gzip | ⚪︎ | ◎ | ◎ | ◎ | 主に単一ファイルの圧縮に特化。 Web サーバーでのコンテンツ転送量削減によく使用される。 |
Bzip2 | ◎ | △ | ⚪︎ | ⚪︎ | 高圧縮率を実現するが、圧縮・解凍速度は遅め。 大容量ファイルのアーカイブに適している。 |
7z | ◎ | △ | ◎ | ⚪︎ | 非常に高い圧縮率を誇る形式。 多機能性があり、暗号化や分割アーカイブも可能。 |
xz | ◎ | △ | ⚪︎ | ⚪︎ | LZMA2 アルゴリズムを使用し、高圧縮率を実現。Linux 環境でよく使用される。 |
LZ4 | △ | ◎ | ◎ | ⚪︎ | 非常に高速な圧縮・解凍が特徴。 リアルタイムデータ処理やログデータの圧縮に適している。 |
Snappy | △ | ◎ | ◎ | ⚪︎ | Google が開発した超高速圧縮アルゴリズム。 圧縮率は控えめだが、低遅延が求められる場面で使用される。 |
Brotli | ◎ | ◎ | ◎ | ⚪︎ | Google が開発した高圧縮率と高速な圧縮・解凍を実現するアルゴリズム。 特に Web コンテンツの圧縮に最適化されている。 |
Zstd | ◎ | ◎ | ◎ | ⚪︎ | Facebook(現 Meta)が開発した高圧縮率と高速な圧縮・解凍を実現するアルゴリズム。 モダンなシステムでの採用が進んでいる。 |
ファイル圧縮とは
ファイル圧縮とは、データを特定のアルゴリズムに基づいて変換し、ファイルサイズを小さくするプロセスです。
ファイルサイズを小さくすることで、ストレージの節約や転送速度の向上などの利点があります。
ファイル圧縮には様々な形式が存在しますが、どの形式も基本的には 「データの冗長性(重複や無駄な部分)」を削減する ことを目的としています。
例えば、同じ文字やパターンが繰り返される場合、それらを一度だけ保存し、繰り返しの回数を記録することで、データ量を減らすことができます。
そして、この 「冗長性の削除」 に対するアプローチの違いが、「圧縮アルゴリズム」 として形になり、さらにそれが各 ファイル圧縮形式 の圧縮率、圧縮速度、解凍速度といった性能の違いとして現れてきます。
可逆圧縮と非可逆圧縮
ファイル圧縮には、大きく分けて 可逆圧縮 と 非可逆圧縮 の2つの主要なタイプがあります。
今回の記事では、「可逆圧縮形式」についてのみ解説します。
タイプ | 特徴 | 用途 |
---|---|---|
可逆圧縮 | ・データの損失は一切なし ・元のデータを完全に復元可能 |
・文書ファイル、プログラム、データベースのバックアップなど ・元のデータを完全に保持する必要がある場合 |
非可逆圧縮 | ・データの一部が失われる ・元のデータを完全に復元できない |
・画像、音声、動画など ・データ量を大幅に削減する必要がある場合 ・多少の品質低下が許容される場合 |
圧縮アルゴリズムとは
「ファイル圧縮とは、データを特定のアルゴリズムに基づいて変換し、ファイルサイズを小さくするプロセス」と言いましたが、ここでいう アルゴリズム とは、データを効率的に圧縮するための手法やルールのことを指します。
圧縮アルゴリズムの種類や組み合わせを変えることで、圧縮率や圧縮速度、解凍速度などが大きく変わります。
主要な圧縮アルゴリズムの一覧については、記事の最後に「(おまけ) 圧縮アルゴリズム一覧表」としてまとめていますので、ご興味のある方はそちらもご覧ください。
主要な圧縮形式の特徴・用途・使用アルゴリズム
「まずは簡単まとめ」の表では簡潔にまとめましたが、ここでは各圧縮形式の特徴や注意点、使用されるアルゴリズムについてもう少し詳しく解説します。
- tar (Tape Archiver)
- 特徴 : 複数のファイルやディレクトリを一つのアーカイブファイルにまとめるための形式。データ圧縮は行わず、単にファイルを結合するだけの形式
- 使用アルゴリズム : なし(アーカイブ形式のため)
- 参考リンク : GNU tar 公式サイト / GNU tar マニュアル
- zip
- 特徴 : 最も普及しているファイル圧縮形式。複数のファイルを一つのアーカイブにまとめたり、パスワード保護をかけたりできる。Windows や macOS など、多くの OS で標準でサポートされている
- 注意 : 圧縮率は高くないため、大容量ファイルでは他の形式も検討が必要
- 使用アルゴリズム : deflate (主に)、Bzip2、LZMA など
- 参考リンク : PKWARE, Inc. (zip 形式の仕様を管理)
- gzip
- 特徴 : zip と同じ deflate アルゴリズムを使用しているが、主に単一ファイルの圧縮に特化した形式。元々は Unix 系システムで開発された
- 注意 : 複数ファイルの圧縮は tar と組み合わせて利用される (.tar.gz)
- 使用アルゴリズム : deflate
- 参考リンク : RFC 1952 - GZIP ファイル形式仕様 / GNU Gzip 公式サイト
- Bzip2
- 特徴 : deflate とは異なるアプローチで高圧縮率を実現する形式。データを並べ替える BWT という前処理を行うことで圧縮効果を高める。高い圧縮率を誇る反面、圧縮・解凍速度は比較的遅め
- 注意 : CPU リソースに制約がある環境では注意が必要
- 使用アルゴリズム : BWT (Burrows-Wheeler Transform)、MTF (Move-To-Front)、ハフマン符号化
- 参考リンク : bzip2 公式サイト / GitHub - libarchive/bzip2
- 7z
- 特徴 : 非常に高い圧縮率が特徴の形式。複数の強力な圧縮アルゴリズムをサポートしており、特に LZMA や LZMA2 を使うことで優れた圧縮性能を発揮する。暗号化や分割アーカイブなどの多機能性も持つ
- 注意 : OS 標準でのサポートは限定的なため、専用ソフトウェアが必要
- 使用アルゴリズム : LZMA2 (主に)、LZMA、Bzip2、PPMd、deflate など
- 参考リンク : 7-Zip 公式サイト
- xz
- 特徴 : 7z 形式でも使われる LZMA2 アルゴリズムを採用しており、非常に高い圧縮率を誇る形式。圧縮率は高いが、圧縮速度は遅め。Linux 環境のパッケージ管理システムでよく使用される
- 注意 : Linux 環境以外では対応ツールが限られることもあるため注意
- 使用アルゴリズム : LZMA2
- 参考リンク : XZ Utils 公式サイト
- LZ4
- 特徴 : 非常に高速な圧縮・解凍が特徴の形式。圧縮率は他の高圧縮形式に比べて控えめだが、その圧倒的な速度が強みのため、低遅延が求められる場面で広く利用される
- 注意 : ストレージ容量の節約が最優先される場面や、オフラインでの長期保存には不向き
- 使用アルゴリズム : LZ4 (LZ77 系派生)
- 参考リンク : LZ4 GitHub リポジトリ
- Snappy
- 特徴 : Google が開発した、とにかく「超高速」であることを重視した形式。LZ4 と同様に圧縮率は低いが、圧倒的な速度が特徴。レイテンシ (遅延) を最小限に抑えたい場面で使われることが多い
- 注意 : ディスク容量を最大限節約したい場合には不向き
- 使用アルゴリズム : Snappy (LZ77 系派生)
- 参考リンク : Snappy GitHub リポジトリ
- Brotli
- 特徴 : Google が開発した形式で、特に Web コンテンツの圧縮に最適化されている。gzip よりも高い圧縮率を達成でき、特にテキストデータの圧縮に強い。多くのモダンな Web ブラウザとサーバーでサポートが進んでいる
- 注意 : 汎用的なファイル圧縮として利用する場合は、対応ツールの有無や互換性に注意が必要
- 使用アルゴリズム : Brotli (LZ77 系派生 + コンテキストモデリング + ハフマン符号化)
- 参考リンク : Brotli GitHub リポジトリ / RFC 7932 - Brotli 圧縮データ形式
- Zstandard (Zstd)
- 特徴 : Facebook (現 Meta) が開発した形式。高い圧縮率と、LZ4 に匹敵する高速な圧縮・解凍速度を両立させているのが最大の特徴。モダンなシステムでは幅広い用途で gzip や LZ4 の代替として採用が進んでいる
- 注意 : 比較的新しい形式のため、古いシステムや一部の環境ではサポートされていないことがある
- 使用アルゴリズム : Zstd (LZ77 系派生 + エントロピー符号化)
- 参考リンク : Zstandard GitHub リポジトリ / RFC 8878 - Zstandard 圧縮データ形式
実際に CSV ファイルを使って「圧縮率、圧縮・解凍時間比較表」を比較してみる
圧縮率の参考値として、以下の CSV ファイルと計算式を使用しています。
記事内の値はあくまで参考値であり、実際の圧縮率はファイルの内容や構造によって異なる可能性が大いにあることに注意してください。
- ファイルフォーマット : CSV
- ファイルサイズ : 400MB
- 行数 : 929320行
- 列数 : 110列
圧縮率 = (1 - 圧縮後ファイルサイズ / 圧縮前ファイルサイズ) * 100
また、基本的に圧縮時のコマンドはデフォルト設定で実行し、圧縮率などの指定は行っていません。(Brotli のみなぜかデフォルトだと実行が完了しなかったため、-q 7
オプションを指定しています。)
圧縮形式 | 圧縮後ファイルサイズ | 圧縮率 | 圧縮時間 | 解凍時間 |
---|---|---|---|---|
zip | 42MB | 89.5% | 5.6秒 | 1.7秒 |
gzip | 43MB | 89.3% | 6.0秒 | ⭐️0.5秒 |
Bzip2 | 22MB | ⭐️94.5% | 39.3秒 | 5.7秒 |
7z | 24MB | ⭐️94.0% | 38.5秒 | 1.8秒 |
xz | 22MB | ⭐️94.5% | 22.1秒 | ⭐️0.8秒 |
lz4 | 72MB | 82.0% | ⭐️0.5秒 | ⭐️0.6秒 |
Snappy | 86MB | 78.5% | ⭐️1.2秒 | ⭐️0.6秒 |
Brotli (-q 7) | 29MB | ⭐️92.8% | 6.2秒 | ⭐️0.9秒 |
Zstd | 36MB | ⭐️91.0% | ⭐️0.8秒 | ⭐️0.5秒 |
結果考察
結果を見てみると、以下のような傾向が見られます。
zip
、gzip
は圧縮率がやや低めだが、圧縮・解凍速度が速いBzip2
、7z
、xz
は高い圧縮率を実現しているが、圧縮時間が長いlz4
、Snappy
は圧縮率が低いものの、圧縮・解凍速度が非常に速いBrotli
は圧縮率が高く、解凍速度も速いが、圧縮時間はやや長めZstd
は圧縮率が高く、圧縮・解凍速度も速い
Zstd
が圧縮率・圧縮・解凍速度いずれの面でも優れた性能を発揮していることがわかります。
この結果からも、モダンなシステムで Zstd
の採用が進んでいる理由が理解できますね。
さいごに
今回の記事では、ファイル圧縮形式の種類とそれぞれの特徴、用途について詳しく解説しました。
どの圧縮形式を選ぶか迷った場合は、「圧縮率」「圧縮速度」「解凍速度」「互換性」「用途」の5つの観点から、自分の目的や利用環境に最適な形式を選ぶことが重要かもしれません。
私自身、今まで zip
や gzip
しか使ってきませんでしたが、これを機に Zstd
や Brotli
などの新しい圧縮形式も試してみようと思いました。
今回の記事が一人でも多くのファイル形式に悩む方の参考になっていれば幸いです。
改めてにはなりますが、今回紹介した全ての圧縮形式のコマンドチートシートも以下記事にまとめてあります。
こちらもぜひご覧ください。
(おまけ) 圧縮アルゴリズム一覧表
各アルゴリズムの概要について一覧化してみました。
詳細については省いていますので、ご興味のある方は参考リンク等をご参照ください。
圧縮アルゴリズム | 概要 | 参考リンク |
---|---|---|
LZ77 | ・データを先頭から順番に符号化していく辞書形式のアルゴリズム。 ・開発者の Abraham Lempel 氏と Jacob Ziv 氏の頭文字をとって LZ であり、LZ~~ という亜種が多数存在する。 |
*1 |
ハフマン符号化 | ・よく出現する文字には短い符号を、あまり出現しない文字には長い符号を割り当てることで、データ量を削減する。 ・多くの圧縮アルゴリズムの最終段階で利用され、圧縮率を向上させる。 |
- |
deflate | ・LZ77 と ハフマン符号化 を組み合わせたアルゴリズム。・高い互換性と高速な圧縮・展開速度を持つ。 |
*2 |
BWT | ・入力データを圧縮しやすいものに変換する前処理的なアルゴリズム。 ・データを並べ替え、同じ文字が連続するように変換することで、後続の圧縮アルゴリズムの効果を高める。 |
- |
MTF | ・データの頻出文字を前方に移動させることで、後続の圧縮アルゴリズムの効果を高める。 ・特に BWT と組み合わせて使用されることが多い。 |
- |
LZMA2 | ・LZ77 をベースとした高圧縮率のアルゴリズム。・高い圧縮率を実現する一方で、展開速度も比較的速い。 |
- |
lz4 | ・LZ77 をベースとした高速圧縮アルゴリズム。・圧縮率は控えめだが、データベースやストリーミングデータなど、低遅延が求められる場面に適している。 |
*3 |
Snappy | ・Google が開発した超高速圧縮アルゴリズム。 ・圧縮率は控えめだが、 lz4 同様にデータベースやストリーミングデータなど、低遅延が求められる場面に適している。 |
*4 |
Brotli | ・Google が開発した LZ77 、ハフマン符号化 などを組み合わせた圧縮アルゴリズム。・高速な圧縮速度ながらも deflate よりも高い圧縮率が特徴。 |
*5 *6 |
Zstandard (Zstd) | ・Facebook (現 Meta) が開発した、高圧縮率と高速な圧縮・展開を両立するアルゴリズム。 ・近年多くのシステムで採用が進んでいる。 |
*7 *8 |
*1:http://www.faqs.org/faqs/compression-faq/part1/section-7.html
*2:https://datatracker.ietf.org/doc/html/rfc1951
*4:https://github.com/google/snappy
*5:https://github.com/google/brotli
*6:https://datatracker.ietf.org/doc/html/rfc7932