題 為什麼zip文件看起來比源文件大,特別是當它是文本時?


我有一個19字節大小的文本文件,並使用zip和7zip壓縮文件,它看起來更大。我讀過這個問題 為什麼7zipped文件比原始文件大? 以及 ZIP壓縮為什麼不壓縮任何東西? 但考慮到文件尚未壓縮,我預計會進一步壓縮。附件是截圖。

enter image description here

EDIT0

我通過創建包含隨機數據的文件進一步採用瞭如下示例 dd if=/dev/urandom of=sample.log bs=1G count=1 並嘗試使用zip和7zip壓縮文件,但沒有壓縮增益。這是為什麼?

enter image description here


4
2017-08-29 06:39


起源


這是一個純文本1GB日誌文件? - CyberSkull
@Cyber​​Skull - 是的。 - PeanutsMonkey
你能告訴我們你的拉鍊參數是什麼嗎?我會做的事情 zip -9T "example.zip" sample.log (-t 只是為了測試檔案的完整性。 - CyberSkull
來自/ dev / urandom的隨機數據 不 生成一個真正的文本文件;它根本不會很好地壓縮。文本字節的範圍是有限的,有許多空格和重複模式(例如“th”和“sp”)和單詞。實際上,您已生成一個隨機二進製文件。 - Ken
@Cyber​​Skull:不,你有一個隨機的ASCII字符流。這比隨機二進製文件更具可壓縮性,但仍遠不及文本結構。 - Ben Voigt


答案:


正如@kinokijuf所說,有一個文件頭。但是要擴展它,還有一些其他的東西要理解文件壓縮。

zip標題包含用於標識文件類型(幻數),zip版本以及最終列出歸檔中包含的所有文件的所有必要信息。

你的文件可能還沒有被壓縮。如果你跑 unzip -l example.zip 您可能會看到文件大小不變。如果DEFLATE(zip使用的主要壓縮方法)完全可壓縮,則19字節可能會產生比保存更多的開銷。

在其他情況下,例如PNG圖像,它們已經被壓縮,因此zip只會存儲它們。 DEFLATE不會壓縮任何已壓縮的東西。

另一方面,如果你有很多文本文件,並且每個文件的大小超過幾千字節,你可以將它們全部放入  zip存檔。

在壓縮非常規則的格式化數據(如包含SQL轉儲的文本文件)時,您將獲得最大的節省。例如,我曾經有一個大約13MB的小型SQL數據庫轉儲。我跑了 zip -9 dump.sql dump.zip 在它之後,最終以1MB左右結束。

另一個因素是您的壓縮級別。默認情況下,許多歸檔程序只會在中級壓縮,速度超過縮減。使用zip壓縮時,請嘗試使用 -9 最大壓縮的標誌(我認為3.x手冊說壓縮級別目前僅由DEFLATE支持)。

TL; DR

存檔的開銷超過了壓縮文件所獲得的任何收益。嘗試將更大的文本文件放在那裡,看看你得到了什麼。使用 -v 當你去的時候用拉鍊來看你的積蓄。


8
2017-08-29 07:08



如果我說解壓縮文件大小沒有改變,你的意思是存檔的大小嗎?其次,如果我使用除了DEFLATE之外的其他壓縮方法,例如PPMD,它會有所作為嗎?所以當你說的時候 -V 你是說我執行時的標誌 zip 命令? - PeanutsMonkey
當你說文件類型時,你的意思是源的文件類型,例如文字,MP3等? - PeanutsMonkey


因為.zip標頭的開銷是 辦法 大於19個字節。


4
2017-08-29 06:43



這對較大的文本文件有何影響? - PeanutsMonkey


壓縮會刪除冗餘信息,這些信息在數據結構高度時出現。

從這一點可以看出,已經壓縮的文件無法進一步壓縮,因為冗餘已經消失,而且隨機數據也不能很好地壓縮,因為它從未有過任何結構或冗餘。

有一整套科學,信息理論,涉及測量信息密度(和互信息),並使用冗餘和結構來執行壓縮,加密攻擊以及錯誤檢測和恢復。


1
2018-05-28 19:27