7zipで圧縮されたファイルがrawファイルよりも大きいのはなぜですか?[複製]


37

重複の可能性:
ZIP圧縮が何も圧縮しないのはなぜですか?

7 .exeファイルを圧縮してみましたが、実際には大きくなりました。

ここに画像の説明を入力してください

これは期待される結果ですか?


3
はい、それは期待される結果です。どうして?何かが既に圧縮されている場合(=可能な限り小さいスペースを使用している場合)、それ以上圧縮することはできません。
woliveirajr

4
他の人に追加するだけです-このexeファイルは具体的にはインストーラーであるため、その内容のほとんどはおそらくzipまたはcabアーカイブです。通常のexeファイルと同じ結果は得られません(ただし、ほとんどの通常のexeファイルは145メガバイトにはなりません)
ランダム832

1
基本的なロジックのみを使用した説明:圧縮では、未加工ファイルについては一意の圧縮ファイルが、圧縮ファイルについては一意の未加工(非圧縮)オリジナルファイルが検出されます。8ビットファイルがあり、それらを5ビットファイルに圧縮したいとします。256個の一意の8ビットファイルがありますが、32個の一意の5ビットファイルのみです(!)。したがって、一部の8ビットファイルを同じ5ビットファイルに圧縮する必要があります(!)。また、2つの異なる生ファイルが同じZIPファイルに圧縮されている場合、解凍後にどちらを取得しますか?
zip圧縮方法では、zip圧縮

回答:


78

エントロピーと呼ばれる概念になります。ウィキペディアを参照してください。

基本的な考え方は、常にファイルを小さくできる圧縮操作が存在する場合、その圧縮操作はすべてのファイルを0バイトに減らし、すべてのデータを保持できることをロジックが決定するというものです。しかし、これはばかげています。なぜなら、0バイトでは情報をまったく伝達できないことがわかっているからです。そのため、入力を常に小さくする圧縮アルゴリズムが存在ないことが証明されました。その場合、情報は0バイトで保存できますが、0バイトは情報がないことを意味するため、 tに情報がなくすべての情報が同時にあります。したがって、それはばかげている。

この理論的概念により、これまでに使用したすべての圧縮プログラムは 、一部の入力のサイズを増やします(せいぜい同じサイズを維持します)。つまり、設計または使用する圧縮アルゴリズムには、特定の入力が小さくなりますが、そうでない入力もあります。

ほとんどのロスレス圧縮アルゴリズムは同じ理論原理に基づいているため、すでに圧縮されたデータは一般に、さらなる圧縮のひどい候補です。あるも、さらに悪い圧縮データを圧縮することが可能。しかし、これは、元のデータから最適なアルゴリズムを使用して単純に圧縮するよりも効率的ではありません。

たとえば、100 MBのテキストファイルがあり、通常のZipアルゴリズムを使用して圧縮すると、50 MBに圧縮される可能性があります。次に、ZZファイルをLZMA2で圧縮すると、LZMAのほとんどの圧縮可能なデータの圧縮率はZipよりも高いため、40または45 MBに圧縮される可能性があります。したがって、Zipはすべてのエントロピーを完全に吸い込むわけではないため、Zipデータを圧縮することもできます。ただし、Zipコンテナーを完全に削除する場合は、LZMA2で生テキストを圧縮することでさらに小さくできる可能性があります。 。

圧縮しようとしているバイナリの場合、7-Zipファイル形式は独自の内部構造を作成し、既に圧縮された実行可能ファイルのデータを7-Zip形式にパックする必要があるため、サイズが大きくなります。これには、辞書、ファイルヘッダーなどが含まれます。これらの余分なデータは通常、データ自体の圧縮の節約によって相殺されますが、圧縮しようとしている実行可能ファイルはLZMAの何らかの形式で既に圧縮されているようです。そうしないと、実行可能ファイルのサイズが2 MB(大量)増加するのではなく、実行可能ファイルのサイズが縮小されるか、わずかに増加する可能性があります。


ところで、この質問に答えるための最も重要な部分は最後にあります。「これには、辞書、ファイルヘッダーなどが含まれます。これらの追加データは、通常、データ自体の圧縮の節約によって相殺されますが、圧縮しようとしている実行可能ファイルは、何らかの形式のLZMAで既に圧縮されているようです」
-jhocking

6
@jhocking:いいえ、最も重要な部分は真ん中に向かって います。「これまでに使用した圧縮プログラムはすべて、入力のサイズを大きくするでしょう...」 7zipのファイル形式には辞書/ファイルヘッダーなどがありますが、7zipがこれらのいずれも持たないアルゴリズムを使用した場合でも、一部の(実際には、ほとんどの)入力には次のような出力があることが保証されています入力自体よりも大きいまたは大きい。これは情報理論の基本的な事実であり、ファイルヘッダーとは関係ありません。
BlueRaja-ダニーPflughoeft

2
@Mehrdad Sure:常に元の入力を返す「圧縮」アルゴリズムを記述するだけです。そこ; できた。:P ...それとは別に、いいえ-アルゴリズムである圧縮アルゴリズムは、ファイルが圧縮されているかどうかを示すファイルの先頭のほんの1ビットであっても、何らかのメタデータを持ちます(0 ==非圧縮、1 ==圧縮)。ファイルの内容をすべて変更する場合はメタデータが必要です。また、コンテンツを変更する場合は、いくつかの入力を大きくします。
allquixotic

1
ただし、「メタデータの固定量を超えて入力の長さを延長しない圧縮アルゴリズムはありますか」という質問であれば、答えは「わかりませんが、理論的には可能であるはずです」です。実際、簡単です。あなたがしなければならないことができ、コンテナフォーマットの開発であるいずれかのオリジナルファイル、含まれているか、圧縮されたデータストリームを。次に、アーカイブを作成するときに圧縮を試みます。圧縮サイズが入力よりも大きい場合は、元の入力を保存し、メタデータを前にパックします。ファイルサイズが大きくなりますが、メタデータは(続き)小さい場合
allquixotic

2
@Mehrdad:「入力の長さを増やさない圧縮アルゴリズムはありますか(しかし、劣っていますか)」-答えはノーです。2^(n+1)-1サイズがnビット以下のメッセージが考えられます。アルゴリズムは、これらのそれぞれを一意の出力にマッピングする必要があります。これらのいずれかがビット数の少ない値にマッピングされる場合、別の値は必ずビット数の多い値にマッピングされる必要があります。
BlueRaja-ダニーPflughoeft

7

7zで使用される基礎となる圧縮アルゴリズムはロスレスです。つまり、ファイルを何度も繰り返し圧縮/解凍することができます。さらに、各反復の後、ファイルはまったく同じままなります。

残念ながら、ロスレス圧縮アルゴリズムが何度も適用され、常に良い結果が得られるとは期待できません。飛び越えることのできない厳しい境界があります。おおよそ、この境界は入力シーケンスがランダムデータをどれだけ密接にアンサンブルするかに依存します。何よりも、ロスレスアルゴリズムは、ファイル圧縮、インターネットHTMLデータ転送、バックアップ、および出力ファイルがまったく同じ元の入力ファイルに解凍されることを期待するその他の操作に使用されます。

ロスレス圧縮とは対照的に、ロスフル(またはロッシー)圧縮アルゴリズムを使用した圧縮後は、常にファイルサイズの減少が予想されます。欠点は、1回の圧縮/解凍の反復後に元のファイルを正確に復元できないことです。これらのアルゴリズムは、オーディオ/ビデオ/画像の送信と保存で最も有名です。

7z形式で使用されるbzip2LZMALZMA2およびその他のアルゴリズムはすべてロスレスです。そのため、制限を超えると圧縮できなくなります。さらに、実行可能イメージ(.exe)は通常、高度に圧縮されたファイルです。他の多くの圧縮ツールと同様に7zipにはメタデータが埋め込まれているため、実際には出力ファイルが大きくなる可能性があります。

頭の体操:常にファイルのサイズを縮小できるロスレスアルゴリズムがあった場合はどうでしょうか。

この場合、圧縮ファイルが入力ファイルよりも小さいことが常にわかるはずです。なぜできないのか、以下のコメントをご覧ください。


5
矛盾による証明。仮説: ロスレスアルゴリズムで常にファイルを圧縮できると仮定します。 ステップ1。単一の圧縮により、出力ファイルが少なくとも1ビット小さくなります。もしそうなら、何度か繰り返した後、2ビットしかないファイルになります。ステップ2次の反復により、サイズが1ビットのファイルが作成されます。ステップ3ただし、圧縮アルゴリズムはロスレスです。つまり、許可される有効な圧縮解除は1つだけです。明らかに、1つの圧縮ビットから2つの元のビットを復元することはできません-推測する必要があります。最後の点は仮説に違反しています。
oleksii

ファイルを小さくするアルゴリズムを保証することはできませんが、そのような場合に「圧縮」を適用しないことでサイズを大きくしないアルゴリズムを保証することはできません。ただし、実際にファイルサイズを増加させないためには、これを帯域外(ファイル名など)で示す必要があります。
jeteon

@jeteonあなたが何を言おうとしているのかわかりません。
oleksii

入力を圧縮しないオプションが常にあるため、最悪でもファイルをまったく圧縮しない圧縮プログラムを使用できることを付け加えました。基本的に、圧縮バージョンが非圧縮バージョンよりも大きいと判断した場合は、そのままにしておきます。また、出力のサイズを増やさずにファイルが圧縮されていないことを解凍プログラムが認識できるように、何らかの方法でこれを示す必要があります。ファイルサイズを大きくせずにこれを行う唯一の方法は、ファイル名を変更するようなものです。
jeteon

@jeteonああ、なるほど。うん、理にかなっています。
oleksii

6

元の実行可能ファイルが既に圧縮されていた(または圧縮率の高いデータや圧縮できないデータが含まれていた)場合、圧縮するとサイズが大きくなります。


2

ほとんどの圧縮アルゴリズムは、シンボルテーブルと呼ばれるいただきました、それが要素として使用するファイルのbasiclyだけpeices使用CAN圧縮を。もちろん、これはファイルにいくらかのオーバーヘッドを作成しますが、通常ははるかに小さなファイルになります。

すでに圧縮されたファイルでは、シンボルのセットが作成されますが、サイズを縮小できるものはほとんどありません。あなたの場合、すでに圧縮されたファイルのシンボルテーブルは、おそらく2 MB近くにあります。何らかの圧縮を実行できた場合は、おそらくそれ以上です。


0

圧縮するアイデア:

圧縮ソフトウェアはファイルのリストを作成し、重複するコンテンツを排除します。

既に圧縮されているファイルを圧縮する場合、圧縮ファイルが元のファイルよりも大きくなる場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.