為什麼 7zip 壓縮檔案比原始檔案大?

為什麼 7zip 壓縮檔案比原始檔案大?

可能的重複:
為什麼 ZIP 壓縮不壓縮任何內容?

我嘗試對 .exe 檔案進行 7zip 壓縮,但它實際上變得更大。

在此輸入影像描述

這是預期的結果嗎?

答案1

這歸結為一個稱為。看維基百科

基本想法是,如果存在壓縮操作總是使檔案更小,那麼邏輯表明所述壓縮操作將能夠將任何檔案減少到 0 位元組,並且仍然保留所有資料。但這是荒誕,因為我們知道0位元組根本不能傳達任何訊息。所以我們剛剛證明了不可能存在一種總是使其輸入更小的壓縮演算法,因為如果是這種情況,任何資訊都可以儲存在 0 位元組中——但 0 位元組意味著缺席的訊息,所以你不能同時擁有資訊與全部資訊.因此,這是荒謬的。

由於這個理論概念,您使用過的每個壓縮程式都會增加 的大小(或最多保持相同的大小)一些輸入。也就是說,對於您設計或使用的任何壓縮演算法,某些輸入會變小,而有些則不會。

已經壓縮的資料通常不適合進一步壓縮,因為大多數無損壓縮演算法都基於相同的理論原理。它可以進一步壓縮壓縮不良的資料;但這比一開始就使用最佳可用演算法從原始資料中壓縮它的效率要低。

例如,如果您有 100 MB 的文字檔案並使用常規 Zip 演算法對其進行壓縮,則它可能會被壓縮到 50 MB。如果您隨後使用 LZMA2 壓縮 Zip 文件,則可能會將其縮小到 40 或 45 MB,因為 LZMA 有一個更高的壓縮比對於大多數可壓縮資料來說,比 Zip 更有效。所以照理說它也可以壓縮 Zip 數據,因為 Zip 並沒有完全吸走其中的所有熵。但是,如果您完全消除 Zip 容器,則可以透過使用 LZMA2 壓縮原始文字來使其變得更小,可能會產生大約 30 - 35 MB 的大小(這些只是用於說明概念的「空氣數字」) 。

對於您要壓縮的二進位文件,它是更大因為 7-Zip 檔案格式必須建立自己的內部結構並將已壓縮的可執行檔的資料打包為 7-Zip 格式。其中包含字典、文件頭等內容。這些額外的資料通常會被壓縮資料本身節省的空間所抵消,但您嘗試壓縮的可執行檔似乎已經使用某種形式的 LZMA 進行了壓縮;否則,它可能會縮小可執行檔的大小或稍微增加它,而不是增加 2 MB(這是很多)。

答案2

7z 中使用的底層壓縮演算法是無損的。這意味著您可以多次迭代地壓縮-解壓縮檔案。此外,每次迭代後檔案將保留確切地相同。

不幸的是,你不能指望無損的壓縮演算法可以多次應用,並且總是有正面的結果。有一個嚴格的界限,它無法跨越。粗略地說,這個邊界取決於輸入序列與隨機資料的緊密程度。最重要的是,無損演算法用於檔案壓縮、Internet HTML 資料傳輸、備份和其他期望將輸出檔案解壓縮為完全相同的原始輸入檔案的操作。

相比之下無損的壓縮,您可能總是期望壓縮後檔案大小會減小有損(或有損)壓縮演算法。缺點是你不能確切地在一次壓縮-解壓縮迭代後恢復原始檔。這些演算法最著名的是音訊/視訊/影像傳輸和儲存。

壓縮包2,拉茲瑪,LZMA2以及其他使用的演算法7z格式都是無損的。因此會有一個限制,超過這個限制就無法再壓縮。最重要的是,可執行映像(.exe)通常是高度壓縮的檔案。7zip正如許多其他壓縮工具嵌入一些元數據,這實際上可以使輸出檔案更大。

腦筋急轉彎:如果我們確實有一個始終可以減少檔案大小的無損演算法會怎麼樣?

在這種情況下,您將始終看到壓縮檔案小於輸入檔案。請參閱下面的評論為什麼這是不可能的。

答案3

如果原始可執行檔已被壓縮(或包含嚴重壓縮的資料或不可壓縮的資料),則壓縮它會增加大小。

答案4

壓縮思想:

壓縮軟體建立檔案清單並消除重複內容。

當壓縮已經壓縮的檔案時,您的壓縮檔案可能會比原始檔案大。

相關內容