2008年4月5日

壓縮軟體之比較

因為之前家裏File Server曾經因為PCI硬碟擴充卡出現問題,250G和80G硬碟的資料全毀,當時所有的卡通MP3和APE無失真音樂全數陣亡,讓我當場傻掉。
也因為這樣,我在之前文章提過了,在去年啟動了RAID計畫,把File Server電腦更新,從K7-度龍800升級到Core 2 Due電腦。
不過RAID仍舊會有資料損毀的可能,RAID雖然能保證壞一顆硬碟時受到保障,但如果同樣遇到PCI硬碟擴充卡出現問題,又或者IDE RAID上,同條排線的IDE硬碟有問題,都有可能造成RAID停止、資料損毀,甚至於說,RAID本身設定比較複雜,當出現問題時的問題排除步驟錯誤,也很有機會讓RAID掛掉(我在Lab的機器上就發生過)。

最保險的方式,莫過於把資料備份,用燒錄機燒成光碟片,只要光碟片品質好些、不亂丟、不刮傷、不發瘋拿去曬太陽殺菌,原則上來說還算是可以接受的備份方案,最重要的是,和其他備份方式相比,燒光碟成本是最低的。

把資料備份,我習慣上會先壓縮,尤其是MP3、APE這類檔案,因為光碟片本身會有編碼的問題,再加上經過壓縮打包,在解壓縮時我可以判斷檔案是否正常沒有損壞,所以我認為壓縮後燒錄事比較好的辦法。

當要燒錄,就牽涉到壓縮軟體的選用了,經過了一番挑選,我選擇了rar來使用,下面是我這次的挑選過程判斷。

常見的壓縮軟體包括:
zip、rar、7-zip、gzip、bzip2

這次對壓縮的需求有兩項:
1. 要支援分片壓縮,分片壓縮中最重要的一點,分片壓縮的壓縮檔要能獨立解壓縮
2. 要能正常的對中文、簡體中文、日文...等進行壓縮、解壓縮(也就是要支援Unicode)

經過了比較之後,我最後使用rar。

首先我先解釋一下需求,尤其是第1點,什麼叫做分片壓縮的壓縮檔要能獨立解壓縮?
因為我要燒到光碟上,分片壓縮是必要的,雖然光碟片理論上可以放很久,但是大家都知道,實際上光碟片放一放就不能讀的機會其實很高,這也是一片3元和一片12元片子的主要差異~可靠度。
而光碟片除了可能會不能讀之外,也可能因為刮傷等原因出現壞軌,這就會造成某個檔案讀取有問題。
因為媒體的可靠度不是百分之百可靠,因此分片壓縮的壓縮檔,必需要能獨立的解壓縮,這樣一來,就算檔案有損毀,也不會造成資料全毀,頂多是幾首MP3,幾張專輯毀壞罷了。

第2點相信不用多說了,MP3、APE這些音樂檔,各種語言都有,日文、中文、簡體中文都很常見,連韓文、俄文都出現過,不支援多國編碼(Unicode)的壓縮軟體,遇到日文、韓文就掛了,更不要說備份了。

而目前這幾種壓縮檔格式中,唯一全部符合的,就只有rar了。

zip是目前非常常見的壓縮檔格式,不但是使用最廣,也是支援最好,API最齊全的壓縮格式。
很不幸的,zip的歷史因素,造成了zip不支援Unicode的缺憾,正確的說法是,目前大多數的壓縮軟體,對zip的壓縮、解壓縮都不支援Unicode,這包括了WinRAR、WinZip、7-Zip...等。
因此很不幸的,zip落選了,儘管如此,但是因為zip有大量的API支援,目前我嘗試在寫的備份程式,還在試著用zip來達成需求。

rar對於多國語系竟然意外的好,這點和網路上許多WinRAR解簡體壓縮檔的經驗差異很大,事實上,rar壓縮、解壓縮各式語系的檔案,都能夠正常的操作。
而rar對於分片壓縮,也有很獨到的設計,除了rar分片壓縮出來的檔案能夠分片解壓縮外,rar的分片壓縮甚至有類似RAID的能力,能夠多產生幾個壓縮檔,容許幾個壓縮檔損毀,這功能並不常見。
不過rar也不是沒有缺點,他最大的問題在於,他是商業軟體,因此要花錢買,而且它並沒有免費提供壓縮的API。

7-Zip我原本對它頗為看好,一方面他的壓縮比可以很高,又是OpenSource的軟體,我一向對商業軟體有些感冒,而且在軟體介紹中有提到他支援分片壓縮,這讓我很興奮,結果感覺像是騙人的。
7-Zip的優點很多,壓縮比高於RAR等壓縮軟體是他的最大特色,加上他是OpenSource,對於Linux平台支援性很好,在各個平台都支援multi-thread,讓7-Zip在Linux上能夠最大程度的使用到多處理器的能力。
7-Zip對多國語系(Unicode)支援也非常好,預設就是UTF-8,因此基本上沒有檔名亂碼的問題,整體評價來說,僅次於RAR。
但是7-Zip的分片壓縮非常鳥,感覺很敷衍,7-Zip的分片壓縮其實只是簡單的檔案分割,動作流程如下:
1. 按照正常程序把一堆檔案壓縮
2. 壓縮完成之後產生 xxx.7z
3. 把 xxx.7z 開始分割,分割成 xxx.7z.000, xxx.7z.001...等

這有3個很大的缺點:
1. 要分片壓縮,它需要先壓縮,再分割檔案,這表示它的動作過程需要消耗 2倍 的硬碟空間,這在小檔案問題不大,但是當資料大到好幾G,甚至像我這樣好幾十G時,問題就很嚴重了,沒這麼多硬碟空間給它緩衝。
2. 它的每個分片壓縮檔都只是檔案分割,因此要解壓縮前,必需要先合併檔案,把分片壓縮檔還原,之後才能解壓縮,這意味著跟上面同樣的問題,解壓縮時同樣需要消耗 2倍 的硬碟空間。
3. 它必需要先合併分片壓縮檔之後才能解壓縮,這表示只要任何一個檔案損毀,整個資料就報銷了,你無法單獨把某個檔案找出來解壓縮。

此外,7-Zip還有個缺點,它提供的API非常差,尤其是Java的,基本上只有演算法的實作,還不到能用的程度。

至於gzip和bzip2,它的壓縮檔無法事後「加入」,只能夠一次壓縮完,這點問題不大~
gzip和bzip2的主要問題其實也是分片壓縮,它的分片壓縮和7-Zip一樣,都是檔案分割,會面臨同樣的問題,檔案編碼部份我則沒有注意。

2 則留言:

hsc0812 提到...

可以借問一下rar怎麼分卷獨立解壓嗎?

阿呆 提到...

你可以注意到,rar分卷壓縮後,每個壓縮檔的檔名會是:
(檔名).part1.rar
(檔名).part2.rar
(檔名).part3.rar
(檔名).part4.rar

因此,在Windows上,直接把任一個檔案點2下,或者拉到WinRAR,或者在檔案上按右鍵選解壓縮,即可單獨解這個分卷檔。
在Linux上沒有圖形介面,因此會比較麻煩些,但也還好,就按照一般解壓縮方式,執行:
# rar x (檔名).part3.rar

即可把part3分卷的壓縮檔解壓縮。

但請注意到,會需要這樣子解壓縮,主要是檔案遺失或損毀才要這樣,如果正常情況請不要這麼做,因為分卷單獨解壓縮,解出來的檔案會不完整,事實上檔案會是壞的,舉個例子。
今天有張mp3專輯的rar壓縮檔,裡面有10個mp3,分別是:
01.mp3
02.mp3
....
10.mp3

分成3個分卷壓縮檔,分別是:
music.part1.rar
music.part2.rar
music.part3.rar


part1裡面包括
01.mp3, 02.mp3, 03.mp3, 04.mp3

part2裡面包括
04.mp3, 05.mp3, 06.mp3, 07.mp3

part3裡面包括
07.mp3, 08.mp3, 09.mp3, 10.mp3

注意到,每個分卷的壓縮檔都和下個分卷的壓縮檔有個檔案重疊,分別是04.mp3、07.mp3。
如果你只有part2的壓縮檔,你解出來的mp3檔案,04.mp3和07.mp3都會是壞掉的,因為04.mp3前半段一部分在part1,07.mp3後半段一部分在part3,因此04.mp3和07.mp3會不完整。
雖然如此,不過05.mp3、06.mp3會是正常、完整的,所以說,雖然檔案有壞掉或損失,但仍然有部份檔案是沒問題且可以用的,這就是我說rar分卷壓縮的優點所在。
同樣的道理,如果今天剛好part2、part3都是好的,但part1壞了,則我們其實只損失了01.mp3~04.mp3,但05.mp3~10.mp3都沒問題,而這就達成了我們減少檔案損毀的效用了。
如果在7zip中,因為它的分片是檔案切割,同樣的少了一個壓縮檔的情況,則整張專輯全毀,一首mp3都解不出來。