web-dev-qa-db-ja.com

特にテキストの場合、Zipファイルがソースファイルよりも大きく表示されるのはなぜですか?

サイズが19バイトのテキストファイルがあり、Zipと7Zipを使用してファイルを圧縮したところ、サイズが大きくなっているようです。 7zipファイルがrawファイルよりも大きいのはなぜですか? および Zip圧縮が何も圧縮しないのはなぜですか? に関する質問を読みましたが、ファイルを考慮するとまだ圧縮されていないので、さらに圧縮することを期待していました。添付はスクリーンショットです。

enter image description here

EDIT0

次のようにランダムデータを含むファイルを作成して、例をさらに進めましたdd if=/dev/urandom of=sample.log bs=1G count=1そしてZipと7Zipの両方を使用してファイルを圧縮しようとしましたが、圧縮の向上はありませんでした。何故ですか?

enter image description here

6
PeanutsMonkey

@kinokijufが言ったように、ファイルヘッダーがあります。しかし、それを拡張するために、ファイル圧縮について理解すべき他のいくつかのことがあります。

Zipヘッダーには、ファイルタイプ(マジックナンバー)、Zipバージョン、そして最後にアーカイブに含まれるすべてのファイルのリストを識別するために必要なすべての情報が含まれています。

おそらく、ファイルはおそらく圧縮されていません。 unzip -l example.Zipを実行すると、ファイルサイズが変更されていないことがわかります。 19バイトは、DEFLATE(Zipで使用される主な圧縮方法)によって圧縮可能である場合に節約されるよりも多くのオーバーヘッドを生成する可能性があります。

その他の場合、たとえばPNG画像はすでに圧縮されているため、Zipはそれらを保存するだけです。 DEFLATEは、すでに圧縮されているものをわざわざ圧縮することはありません。

一方、テキストファイルがたくさんあり、そのサイズがそれぞれ数キロバイトを超える場合は、それらすべてをsingle Zipアーカイブに入れることで大幅な節約ができます。

SQLダンプを含むテキストファイルなど、非常に規則的なフォーマット済みデータを圧縮すると、最高の節約が得られます。たとえば、私はかつて約13MBの小さなSQLデータベースのダンプを持っていました。その上でZip -9 dump.sql dump.Zipを実行し、その後約1MBになりました。

もう1つの要因は、圧縮レベルです。多くのアーカイバは、デフォルトでは中間レベルでのみ圧縮し、縮小よりも高速になります。 Zipで圧縮する場合は、最大圧縮のために-9フラグを試してください(3.xマニュアルには、現時点では圧縮レベルはDEFLATEでのみサポートされていると記載されていると思います)。

TL; DR

アーカイブのオーバーヘッドは、ファイルを圧縮することで得られる可能性のある利益を上回りました。そこに大きなテキストファイルを入れて、何が得られるかを確認してください。圧縮するときに-vフラグを使用して、節約額を確認します。

10
CyberSkull

.Zipヘッダーのオーバーヘッドは 仕方 19バイトより大きい。

4
kinokijuf

圧縮により、データが高度に構造化されている場合に表示される冗長な情報が削除されます。

このことから、冗長性がすでになくなっているため、すでに圧縮されたファイルはそれ以上圧縮できないことは明らかですが、ランダムデータは構造や冗長性がないため、うまく圧縮されません。

情報(および相互情報量)の密度の測定を扱い、冗長性と構造を使用して圧縮、暗号化への攻撃、およびエラーの検出と回復を実行する、科学全体の情報理論があります。

1
Ben Voigt