zip 壓縮演算法的選擇

最近這半年用到 zip 壓縮的次數變比較頻繁一點,為了節省空間、順便想比較一下使用不同演算法的壓縮率,所以寫一下這篇筆記…

一般常見的壓縮檔格式 (以 Windows 平台來說) 大致上就是 zip、7z、rar ,rar 算是在費時以及壓縮比來講最具經濟效益的一種格式,因為格式本身有專利、壓縮的功能本身是付費授權,且 Win ME 以後 Windows 系統已經內建了 zip 的壓縮、解壓縮功能(雖然是有夠陽春),不需要安裝額外的軟體,在 Windows 平台上公開交換檔案來說,zip 仍舊是一種非常常見的壓縮格式。

zip 畢竟是比較古老的格式(當然後面有出了改良後的版本 zipx、但一直沒有普及),最為人詬病的地方大概就是壓縮率非常的差勁(且不支援unicode檔名),自己手邊的檔案隨便抓一些壓縮後做比較,發現 zip 很容易就比 rar 或 7z 多占 50% 左右的空間 (當然還是要看裡面的檔案格式而定)。

一般壓縮軟體在壓縮檔案的時候大多只會提供使用者選擇壓縮檔的格式,但並不會提供壓縮演算法的選擇,而 7-zip 剛好有提供這樣的選項,於是就用 7-zip 來壓縮 zip 做個比較。

7-zip_zip_algorithm

壓縮檔案的來源是一個 Altera Quartus II 10.1 的專案、一個 u-boot binary 跟 uClinux kernel 這三樣東西包在一起的資料夾,原始檔案大小為16.1 MB (16,882,693 位元組),分別使用不同演算法的最高壓縮率(壓縮層級最高、字組跟字典設定到最大)來看看差異:

  • 7-zip 預設的 deflate 壓縮方式得到的結果 – 6.59 MB (6,914,819 位元組)
  • zip 2.1開始支援的 deflate64 壓縮方式得到的結果 – 6.56 MB (6,883,944 位元組)
  • Bzip2 壓縮方式得到的結果 – 6.54 MB (6,864,045 位元組)
  • LZMA 壓縮方式得到的結果 – 6.34 MB (6,650,600 位元組)
  • PPmd 壓縮方式得到的結果 – 6.40 MB (6,712,996 位元組)

除了對PPmd比較陌生無法猜測結果,其他壓縮方式所得到的結果排序都在預期內,換拿一些已經壓縮過的檔案做測試看會有什麼結果? 拿發行沒多久的ubuntu-14.04-server-i386.iso來壓壓看,由小到大排序結果:

  • ubuntu-14.04-server-i386.deflate64.zip      534 MB (560,864,151 位元組)
  • ubuntu-14.04-server-i386.deflate.zip          534 MB (560,926,334 位元組)
  • ubuntu-14.04-server-i386.bz2.zip                536 MB (562,658,041 位元組)
  • ubuntu-14.04-server-i386.lzma.zip              538 MB (564,486,770 位元組)
  • ubuntu-14.04-server-i386.ppmd.zip            545 MB (572,277,400 位元組)
  • ubuntu-14.04-server-i386.iso                       549 MB  (575,668,224 位元組) (原始檔案)

這時候lzma反而效果比較落後~ 壓縮比最好的 deflate64 也只比原本的 iso 檔案小了15MB,還好檔案沒有變大就是了,iso 裡面還是有包一些沒壓縮過的檔案,如果拿全部都壓縮過的東西再來壓縮的話反而很有可能會長大,小時候不懂事就做過這種事 …

不過壓縮檔比較怕遇到的麻煩是壓縮完解壓縮卻解不開的問題,這部分有點像是同樣是 avi, mkv 附檔名結尾的影片但裡面包的影片格式不同就有可能會有裝置不能播放一樣,這部分拿目前最新版的 7-Zip 9.32 alpha、WinRAR 5.10 beta 4 以及 Windows 7 內建的zip 解壓縮工具來測試,很悲劇的是除了deflate & deflate64以外,其他壓縮方法都沒辦法被 Windows(7) 支援,其中有些檔案可以解的出來,有些則會出現如下的錯誤:windows-zip-extract-error

壓縮軟體中分別是自由軟體以及商業軟體的龍頭 7-zip 、 winrar 全部都能順利解壓縮沒問題,但考量到對方電腦如果有這類壓縮軟體大概,直接用 7z 去壓縮就好了、也沒必要用 zip 了,為了相容性考量,以後壓 zip 還是用 deflate64 來壓縮好了 …

關於zip壓縮格式的更多資料可以參考維基百科: http://en.wikipedia.org/wiki/Zip_(file_format) (中文版)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。