推薦一款Facebook開源的高性能壓縮工具Zstd (支持 macOS/Linux/Windows 全平臺(tái))
壓縮工具中的神器: 壓縮比高,速度快,性能好
1. 工具介紹
主要介紹 zstd 工具的作用和性能測(cè)試
我們稱 Zstandard 或 Zstd 是一種快速的無損壓縮算法,是針對(duì) zlib 級(jí)別的實(shí)時(shí)壓縮方案,以及更好的壓縮比。它由一個(gè)非??斓撵仉A段,由 Huff0 和 FSE 庫(kù)提供。這個(gè)項(xiàng)目是作為開源的 BSD 許可收費(fèi)的庫(kù),以及一個(gè)生成和解碼 .zst 格式。
- 性能測(cè)試對(duì)比
Compressor name | Ratio | Compression | Decompress. |
---|---|---|---|
zstd 1.4.4 -1 | 2.884 | 520 MB/s | 1600 MB/s |
zlib 1.2.11 -1 | 2.743 | 110 MB/s | 440 MB/s |
brotli 1.0.7 -0 | 2.701 | 430 MB/s | 470 MB/s |
quicklz 1.5.0 -1 | 2.238 | 600 MB/s | 800 MB/s |
lzo1x 2.09 -1 | 2.106 | 680 MB/s | 950 MB/s |
lz4 1.8.3 | 2.101 | 800 MB/s | 4220 MB/s |
snappy 1.1.4 | 2.073 | 580 MB/s | 2020 MB/s |
lzf 3.6 -1 | 2.077 | 440 MB/s | 930 MB/s |
Zstd 還可以壓縮速度為代價(jià)提供更強(qiáng)的壓縮比,Speed vs Rtrade 可以通過小增量進(jìn)行配置。在所有設(shè)置中,解壓速度保持不變,并在所有 LZ壓縮算法( 比如 zlib 或者lzma) 共享的屬性中保持不變。
以前的壓縮方式,都是適用于典型文件和二進(jìn)制的壓縮方案( MB/GB)的情況。然而,要壓縮的數(shù)據(jù)量越小,壓縮就越困難。這是所有壓縮算法都存在的問題,原因是壓縮算法從過去的數(shù)據(jù)中學(xué)習(xí)如何壓縮未來的數(shù)據(jù)。但是在一個(gè)新的數(shù)據(jù)集的開始,沒有“過去”可以參考。
為了解決這種情況,Zstd 提供了一種新的訓(xùn)練模式,可以使用這種模式對(duì)所選數(shù)據(jù)類型的算法進(jìn)行調(diào)優(yōu)。訓(xùn)練 Zstandard 是通過提供一些樣本(每個(gè)樣本一個(gè)文件)來實(shí)現(xiàn)的,訓(xùn)練的結(jié)果存儲(chǔ)在稱為**“字典”**的文件中,該文件必須在壓縮和解壓縮之前加載。使用此字典,可以在小數(shù)據(jù)上實(shí)現(xiàn)的壓縮率大大提高。
以下示例,使用由 github 公共 API 創(chuàng)建的 github 用戶示例集。它由大約 10K 條記錄組成,每條記錄 1KB 左右。
- 小數(shù)據(jù)壓縮的案例
如果在一組小的數(shù)據(jù)樣本中存在某種相關(guān)性,那么訓(xùn)練就是有效的。一個(gè)字典的數(shù)據(jù)越具體,它的效率就越高(沒有通用字典)。因此,為每種類型的數(shù)據(jù)部署一個(gè)字典將帶來最大的好處。字典增益在前幾個(gè) KB 中最有效。然后,壓縮算法將逐步使用先前解碼的內(nèi)容,以更好地壓縮文件的其余部分。
- 字典壓縮使用示例
- # 訓(xùn)練字典
- $ zstd --train FullPathToTrainingSet/* -o dictionaryName
- # 用字典壓縮
- $ zstd -D dictionaryName FILE
- # 用字典解壓縮
- $ zstd -D dictionaryName --decompress FILE.zst
- 提供客戶端工具
2. 參數(shù)命令
主要介紹 zstd 工具的安裝和全部的參數(shù)命令
- 安裝方式
- # Ubuntu
- $ apt install zstd
- # CentOS
- $ yum install zstd
- # 編譯安裝
- $ git clone https://github.com/facebook/zstd.git
- $ cd zstd; make; sudo make install
- 參數(shù)命令
- $ zstd --help
- 使用方式 :
- zstd [args] [FILE(s)] [-o file]
- 參數(shù)選項(xiàng) :
- -# : 壓縮級(jí)別(1-19,默認(rèn)值為3)
- -d : 解壓
- -D file: 使用文件作為字典
- -o file: 結(jié)果存儲(chǔ)在文件中
- -f : 在沒有提示的情況下覆蓋輸出并(解壓)壓縮鏈接
- --rm : 成功解壓縮后刪除源文件
- -k : 保存源文件(默認(rèn))
- -h/-H : 顯示幫助/長(zhǎng)幫助并退出
- 高級(jí)選項(xiàng) :
- -V : 顯示版本號(hào)并退出
- -v : 詳細(xì)模式
- -q : 靜默輸出
- -c : 強(qiáng)制寫入標(biāo)準(zhǔn)輸出
- -l : 輸出zstd壓縮包中的信息
- --ultra : 啟用超過19級(jí),最多22級(jí)(需要更多內(nèi)存)
- -T# : 使用幾個(gè)線程進(jìn)行壓縮(默認(rèn)值:1個(gè))
- -r : 遞歸地操作目錄
- --format=gzip : 將文件壓縮為.gz格式
- -M# : 為解壓設(shè)置內(nèi)存使用限制
- 字典生成器 :
- --train ## : 從一組訓(xùn)練文件中創(chuàng)建一個(gè)字典
- --train-cover[=k=#,d=#,steps=#] : 使用帶有可選參數(shù)的cover算法
- --train-legacy[=s=#] : 有選擇性地使用遺留算法(默認(rèn)值:9)
- -o file : “file”是字典名(默認(rèn):字典)
- --maxdict=# : 將字典限制為指定大小(默認(rèn)值:112640)
- --dictID=# : 強(qiáng)制字典ID為指定值(默認(rèn):隨機(jī))
- 性能測(cè)試參數(shù) :
- -b# : 基準(zhǔn)測(cè)試文件,使用#壓縮級(jí)別(默認(rèn)為1)
- -e# : 測(cè)試從-bX到#的所有壓縮級(jí)別(默認(rèn)值:1)
- -i# : 最小計(jì)算時(shí)間(秒)(默認(rèn)為3s)
- -B# : 將文件切成大小為#個(gè)獨(dú)立塊(默認(rèn):無塊)
- --priority=rt : 將進(jìn)程優(yōu)先級(jí)設(shè)置為實(shí)時(shí)
3. 使用技巧
主要介紹一些關(guān)于 zstd 工具的使用示例和參數(shù)解釋
- 簡(jiǎn)單使用
- # 將一個(gè)文件壓縮成一個(gè)后綴為.zst的新文件
- # 如果命令后面沒有文件或文件為-的話,則讀取標(biāo)準(zhǔn)輸入
- $ zstd file
- # 在壓縮操作后刪除源文件
- # 默認(rèn)情況下,源文件在成功壓縮或解壓縮后不會(huì)被刪除
- $ zstd --rm file
- # 解壓zst壓縮包
- $ zstd -d file.zst
- # 解壓zst壓縮包到標(biāo)準(zhǔn)輸出
- $ zstd -dc file.zst
- # 查看zst壓縮包
- $ zstd -l file.zst
- $ zstdcat file.zst
- 高級(jí)用法
- # 輸出詳細(xì)信息
- $ zstd -v file
- $ zstd -v -d file.zst
- # 壓縮一個(gè)文件同時(shí)指定壓縮級(jí)別(19最高,0最低,3為默認(rèn))
- $ zstd -level file
- $ zstd -9 file
- # 使用更多的內(nèi)存(壓縮和解壓時(shí))以達(dá)到更高的壓縮比
- $ zstd --ultra -level file
- # 解壓縮為單進(jìn)程
- # 多個(gè)進(jìn)程并發(fā)執(zhí)行壓縮過程(0表示自動(dòng)使用所有CPU核心)
- $ zstd -T0 file
- $ zstd -T4 file
- $ zstd -T4 -d file.zst
4. 參考文檔
- 5 ways Facebook improved compression at scale with Zstandard