コンテンツにスキップ

ZIPの圧縮率はなぜファイルによって大きく違うのか

カテゴリ:ファイル形式

「ZIPで圧縮したのにほとんど小さくならなかった」「テキストファイルは圧縮後にサイズが激減した」という経験はありませんか? ZIPの圧縮率はファイルの種類によって大きく異なります。この記事では、その理由と各ファイル形式の特性を解説します。

ZIPで使われる圧縮アルゴリズム:Deflate

ZIPフォーマット(.zip)は主に Deflate アルゴリズムを使用します。Deflateは以下の2つの技術を組み合わせたものです。

  • LZ77(Lempel-Ziv 1977):データ中の繰り返しパターンを「以前に出現した位置への参照」で置き換える
  • ハフマン符号化:出現頻度の高い文字を短いビット列で表現する

つまり、繰り返しパターンが多いデータほど圧縮率が高く、逆にランダムなデータや既に圧縮済みのデータはほとんど圧縮できません。

ファイル形式別の圧縮率

ファイル形式圧縮率(目安)理由
テキスト(.txt)60〜80%削減繰り返し文字・単語が多い
CSV70〜85%削減区切り文字・同パターンが繰り返す
HTML / XML / JSON65〜85%削減タグ・キー名の繰り返しが多い
ログファイル70〜90%削減タイムスタンプ形式の繰り返しが多い
BMP(無圧縮画像)50〜80%削減同色ピクセルの連続が多い
PDF5〜20%削減内部でzlib圧縮済みのケースが多い
PNG0〜5%削減既にDeflateで圧縮済み
JPEG0〜5%削減既にDCT+ハフマンで圧縮済み
MP3 / AAC0〜3%削減既に不可逆圧縮済み
MP4 / H.2640〜3%削減既に高圧縮済み
ZIP / GZ / 7z0〜2%削減(場合によりサイズ増)圧縮済みデータに再圧縮はほぼ無効

圧縮済みファイルがさらに大きくなる場合

JPEGやMP4などの既に圧縮されたファイルをZIPで圧縮すると、ZIPのヘッダー(ファイルメタデータ)分だけ わずかにサイズが増える ことがあります。ZIPフォーマットは各ファイルに対してローカルファイルヘッダー(30バイト以上)と、ZIP全体のセントラルディレクトリを持つためです。

JPEGファイル (1.00 MB)
 └── ZIP圧縮後: 1.00 MB + ヘッダー(約50B)= わずかに増加

「Store」モードとの使い分け

ZIPには圧縮せずにファイルを格納する Store モードがあります。既に圧縮済みのファイル(JPEG、MP4など)を複数まとめる場合は、Storeモードを使うと圧縮処理のCPU負荷をなくしながら同等のサイズで格納できます。

# zip コマンドで圧縮レベルを指定
zip -0 archive.zip image.jpg video.mp4   # Store(圧縮なし)
zip -9 archive.zip data.csv report.txt   # 最大圧縮

# Python で圧縮レベルを指定
import zipfile
with zipfile.ZipFile('archive.zip', 'w', zipfile.ZIP_DEFLATED, compresslevel=9) as zf:
    zf.write('data.csv')

テスト用ZIPファイルの特性

DevLab のテスト用ZIPファイルは、ファイルサイズを正確にコントロールするために、ランダムデータ(擬似ランダムバイト列) を格納しています。ランダムデータはエントロピーが最大なので Deflate でほぼ圧縮されません。そのため、「10MBのZIPファイル」= 「解凍後も10MB前後」となります。

もし「解凍後に特定のサイズになるZIPが必要」という場合は、以下のような方法でテスト用ファイルを作成できます。

# 解凍後ちょうど 100MB になるZIPを作成(ゼロバイト埋め、高圧縮)
dd if=/dev/zero bs=1M count=100 | zip -9 zero-100mb.zip -

# 解凍後ちょうど 100MB になるZIPを作成(ランダムデータ、ほぼ無圧縮)
dd if=/dev/urandom bs=1M count=100 | zip -0 random-100mb.zip -

まとめ

  • ZIPの圧縮率は データの繰り返しパターン の多さで決まる
  • テキスト・CSV・XMLは 60〜85%削減 できる
  • JPEG・MP4・既圧縮ファイルは ほぼ圧縮できない(むしろわずかに増加)
  • 既圧縮ファイルをまとめる場合は Storeモード(-0) でCPU節約
  • DevLabのテスト用ZIPはランダムデータを使用しているため、解凍前後でほぼ同サイズ

テスト用ZIPファイルのダウンロードはこちら

この記事で使えるテストファイル

📚 関連記事

PNG vs WebP vs AVIF|画像フォーマットの選び方と変換方法

PNG / JPEG / WebP / AVIF の特徴・用途・ブラウザ対応状況を比較。picture 要素での出し分け、DevLab の画像フォーマット変換ツールの使い方も解説。

2026-04-18

Whois でドメイン情報を調べる方法|有効期限・ネームサーバー・登録者

Whois でわかること (登録者・有効期限・レジストラ・NS)、GDPR によるプライバシー保護の影響、ドメイン管理の実務的な使い方を解説。

2026-04-18

HTTP ステータスコード完全ガイド|よくあるエラーの原因と対処法

開発者が頻出する HTTP ステータスコード (200/301/302/400/401/403/404/413/422/429/500/502/503/504) の意味・原因・対処法を解説。301 vs 302 の SEO 影響、400 vs 422 の使い分けも。

2026-04-18

cURL コマンドを JavaScript fetch・Python requests に変換する方法|DevTools 連携

Chrome DevTools の Copy as cURL を fetch / axios / Python requests / PHP cURL / Go net/http に変換する手順を解説。主要 cURL オプション (-X / -H / -d / -F / -u / -b / -L) の変換パターン、認証トークンの扱い、注意点まで。

2026-04-16

Cookie のセキュリティフラグ完全ガイド|Secure / HttpOnly / SameSite / __Host-

Cookie のセキュリティ属性 Secure / HttpOnly / SameSite (Strict/Lax/None) / __Host- __Secure- プレフィックス / 4096 バイト制限を解説。CSRF / XSS / セッションハイジャック対策と、Laravel / Express の実装例。

2026-04-16

JWT のセキュリティベストプラクティス|alg none 攻撃 / 有効期限 / 署名検証

JWT (JSON Web Token) の代表的な脆弱性 6 種類 (alg none 攻撃 / 鍵混同 / 無期限トークン / payload への機密情報 / 失効不可 / 弱いシークレット) と対策。リフレッシュトークンパターン、失効リスト、HttpOnly Cookie 格納まで。

2026-04-16