ZIPを何回も圧縮すればどんどん小さくなる?

雑記Topに戻る

繰り返しても、際限なく小さくはならない

ZIPをさらにZIPへ入れても、通常は大きくは縮まず、逆に少し大きくなることもあります。一度の圧縮で繰り返しや偏りの多くが短い表現へ置き換えられ、その後は同じ方式で削れる余地が小さくなるためです。ただし、二回目が必ず大きくなるとも限りません。圧縮方式や最初の設定、管理情報に残る規則性によって、少し縮む例もあります。

ZIPは箱で、圧縮方式は別にある

ZIPは、複数のファイル名、サイズ、圧縮データ、検査用の情報などをまとめる形式です。その中に使う圧縮方式は一種類とは限らず、無圧縮で格納する方法もあります。「ZIPにした」というだけでは、どの方式でどの程度圧縮したかまで決まりません。

よく使われるDEFLATEは、繰り返し現れるデータを以前の位置への参照で表す処理と、出現に応じた符号化を組み合わせます。例えば長い同じ文字の並びには、短く書き直せる規則性があります。一方、すでに効率よく圧縮したデータには、そのような繰り返しが残りにくくなります。

実際に三重まで圧縮した例

同じZIP設定で包み直した計算例(単位:バイト)
入力 元データ 1回目 2回目 3回目
ABCDEFを1万回繰り返す 60,000 216 196 258
固定シードで作った疑似乱数の列 60,000 60,126 60,252 60,348

この表は、Pythonのzipfileで、各段階のデータをdataという名前の一ファイルとしてZIP_DEFLATEDで格納した実測例です。ZIP内の日時を固定し、疑似乱数はRandom(42)で生成しています。ファイル名や圧縮ライブラリ、設定が違えば数値も変わるので、一般的な圧縮率を示す表ではありません。

繰り返しの列は最初に大きく縮み、二回目にも少し縮みました。しかし三回目には増えています。疑似乱数の列では、最初から圧縮による節約よりZIPの管理情報などの増加が上回っています。「二重ZIPは絶対に縮まない」とも「何度でも縮む」とも言えないことが分かります。

すべてのファイルを短くできない理由

可逆圧縮では、圧縮後のデータから元を区別して戻せなければなりません。長さが$n$ビットのデータは$2^n$通りあります。一方、それより短い長さ0~$n-1$ビットの列は、全部合わせても$2^n-1$通りしかありません。すべての入力へ別々の短い出力を割り当てることはできないのです。

これは単なるソフトの性能不足ではなく、数え上げから分かる制約です。よく現れるデータを短くする代わりに、短くならないデータや長くなるデータも存在します。解凍に必要な辞書や付加情報を別ファイルへ追い出した場合は、その分も含めて比較しなければなりません。

写真や動画をZIPにしても減りにくい

JPEG写真や多くの動画は、すでに用途に合った圧縮をしています。その外側から汎用のZIP圧縮をかけても、大幅には縮みにくいことがあります。ただし、付随情報やファイルごとの構造によって少し変化する可能性はあるため、拡張子だけで圧縮率を断言することはできません。

写真を低画質で保存し直してサイズを減らすことは、ZIPの可逆圧縮とは別の操作です。前者は元の情報を失う可能性があり、後者は正常に圧縮・解凍できれば元のバイト列へ戻します。どちらも「圧縮」と呼ばれるため、違いを意識する必要があります。

小さくしたい目的に合う方法を選ぶ

送付用に複数のファイルを一つへまとめたいなら、サイズが減らなくてもZIPには意味があります。容量そのものを減らしたいなら、不要なデータの除去、画像の用途に合う寸法、最初の圧縮方式や設定を見直します。元ファイルを残し、結果を実測するのが確実です。

ZIPを何重にもすると、解凍や確認の手間が増え、相手が必要なファイルへたどり着きにくくなります。圧縮後のサイズだけでなく、開きやすさ、互換性、解凍後に必要な容量も含めて判断しましょう。

関連する雑記

参考資料

資料確認日:2026年10月2日

雑記Topに戻る