本篇介如何在 Linux 系統上安裝與使用 Zstd 這個快速壓縮與解壓縮工具,應用於即時性的資料壓縮工作。

Zstandard(簡稱 Zstd)是由 facebook 所開發的一套資料壓縮演算法與工具,以開放原始碼的授權方式釋出,它的壓縮比與 DEFLATE 演算法差不多,但是壓縮與解壓縮的速度更快,適合用於即時性的資料壓縮工作,而目前 facebook 內部也正運用 Zstandard 處理各類大量資料的壓縮,是一個相當不錯的壓縮工具。

Zstandard 壓縮演算法

下面這張表格是以 lzbench 這個壓縮演算法標竿測試工具所測試出來的結果,在相同壓縮比(Ratio)之下,Zstandard 的壓縮與解壓縮速度是目前最優秀的。

Compressor nameCompressionDecompress.Compr. sizeRatio
memcpy8657 MB/s8891 MB/s211947520100.00
brotli 2017-03-10 -0225 MB/s246 MB/s7843291337.01
libdeflate 0.7 -1117 MB/s570 MB/s7331837134.59
lz4 1.7.5452 MB/s2244 MB/s10088080047.60
lzf 3.6 -0244 MB/s550 MB/s10568208849.86
lzo1x 2.09 -1394 MB/s551 MB/s10057253747.45
snappy 1.1.4327 MB/s1075 MB/s10214676748.19
zlib 1.2.11 -166 MB/s250 MB/s7725902936.45
zstd 1.1.4 -1242 MB/s636 MB/s7365401434.75

安裝 Zstandard 壓縮工具

若要在 Ubuntu Linux 中,可以使用 apt 來安裝 Zstandard 壓縮工具:

# Ubuntu 安裝 zstd 壓縮工具
sudo apt-get install zstd

若在 CentOS Linux 中,則可使用 yum 安裝:

# CentOS 安裝 zstd 壓縮工具
sudo yum install zstd

在其他的 Linux 系統下,若沒有可以直接安裝的套件,也可以從原始碼自行編譯安裝:

# 下載 zstd 原始碼
git clone https://github.com/facebook/zstd.git

# 編譯 zstd
cd zstd
make

# 安裝 zstd
sudo make install

壓縮檔案

zstd 指令的使用方式跟標準的 gzip 壓縮指令很類似,只是有些小地方不同而已。

若要使用 zstd 壓縮檔案,可以加上 -z 參數,並指定檔案名稱:

# 以 zstd 壓縮檔案
zstd -z my_file.txt
my_file.txt          : 14.81%   (529929 =>  78495 bytes, my_file.txt.zst)

經過 zstd 壓縮之後,會產生 *.zst 的壓縮檔。

zstd 若不加任何參數,預設就是壓縮檔案的意思,所以若要壓縮檔案,可以不需要加任何參數:

# 以 zstd 壓縮檔案
zstd my_file.txt

解壓縮檔案

若要解壓縮 zst 壓縮檔,可以使用 -d 參數:

# 解壓縮 zst 檔案
zstd -d my_file.txt.zst
my_file.txt.zst     : 529929 bytes

unzstd 指令亦可用來解壓縮 zst 壓縮檔,作用跟 zst 加上 -d 參數是相同的:

unzstd my_file.txt.zst

刪除原始檔案

zstd 在壓縮或解壓縮資料時,預設會把原來的檔案或壓縮檔案保留下來,如想讓 zstd 自動刪除原始檔案,可以加上 --rm 參數:

# 以 zstd 壓縮檔案(刪除原始檔案)
zstd --rm my_file.txt

# 解壓縮 zst 檔案(刪除原始檔案)
zstd --rm -d my_file.txt.zst

多檔案與目錄

若要壓縮多個檔案或整個目錄,可以配合 tar 指令,先將檔案壓縮成單一檔案後,再用 zstd 壓縮:

# 使用 tar 與 zstd 壓縮目錄
tar -I zstd -cvf my_folder.tar.zst my_folder/

# 使用 tar 與 zstd 壓縮多個檔案
tar -I zstd -cvf my_files.tar.zst file1.txt file2.txt

若要解壓縮 *.tar.zst 壓縮檔,可以執行:

# 使用 tar 與 zstd 解壓縮 *.tar.zst 檔案
tar -I zstd -xvf my_folder.tar.zst

查看 zst 壓縮檔

若要查看 zst 壓縮檔案的內容,可以使用 -l 參數:

# 查看 zst 壓縮檔案內容
zstd -l my_file.txt.zst
===========================================
Printing information about compressed files
===========================================
Number of files listed: 1
my_file.txt.zst (1/1):
Skippable  Non-Skippable  Compressed  Uncompressed  Ratio  Check  Filename
        0              1    76.66 KB     517.51 KB  6.751  XXH64  my_file.txt.zst

檢查 zst 壓縮檔內容是否正常

若要檢查 zst 壓縮檔案內容是否正常,可以使用 -t 參數:

# 檢查 zst 壓縮檔內容是否正常
zstd -t my_file.txt.zst
my_file.txt.zst     : 529929 bytes

-t 的效果就等同於 --decompress 加上 --stdout,然後將解壓縮的輸出丟棄。

解壓縮並輸出 zst 壓縮檔案內容

若要直接解壓縮並輸出 zst 壓縮檔案內容,可以使用 -dcf 參數:

# 解壓縮並輸出 zst 檔案內容
zstd -dcf my_file.txt.zst

或是使用 zstdcat 指令:

# 解壓縮並輸出 zst 檔案內容
zstdcat my_file.txt.zst

指定壓縮層級

zstd 的壓縮層級範圍是 119,預設值是 3,我們可以接用數字參數調整這個設定值:

# 指定壓縮層級
zstd -9 my_file.txt
my_file.txt          : 12.05%   (529929 =>  63862 bytes, my_file.txt.zst)

若在正常的壓縮層級還是不夠用的時候,可以使用 --ultra 參數提高壓縮層級上限,最高可以達到 22,不過在這種模式之下,壓縮與解壓縮時會需要大量的記憶體。

多執行緒

如果資料比較多的時候,可以加上 -T 參數,並指定執行緒的數量,以多執行緒的方式平行進行壓縮或解壓縮工作:

# 以多執行緒平行進行壓縮
zstd -T4 my_file.txt

# 以多執行緒平行進行解壓縮
zstd -T4 -d my_file.txt.zst

若將執行緒數量指定為 0,則可自動使用所有的 CPU 核心進行平行的壓縮或解壓縮:

# 自動使用所有 CPU 核心
zstd -T0 my_file.txt

zstdmt 指令是 zstd 的多執行緒版本,等同於 zstd 加上 -T0 參數:

# 自動使用所有 CPU 核心
zstdmt my_file.txt

標竿測試

如果想測試 zstd 在不同壓縮層級的效能,可以使用 -b 參數進行標竿測試,並指定想測試的壓縮層級:

# 測試壓縮層級 5 的效能
zstd -b5
 5#Synthetic 50%     :  10000000 ->   3271570 (3.057),  38.8 MB/s , 550.0 MB/s

實時(Real-time)

若在即時性的壓縮應用上,在執行 zstd 時可以加上 --priority=rt,將 zstd 壓縮指令的行程設定為實時(Real-time),讓壓縮工作盡可能加速:

# 實時(Real-time)壓縮行程
zstd --priority=rt my_file.txt

顯示詳細輸出

若要讓 zstd 顯示更詳細的輸出資訊,可以加上 -v 參數:

# 顯示詳細輸出
zstd -v my_file.txt.zst
*** zstd command line interface 64-bits v1.3.1, by Yann Collet ***
my_file.txt          : 14.81%   (529929 =>  78495 bytes, my_file.txt.zst)

zstd 還有許多其他的參數可以使用,關於其餘各種參數使用說明,可以參考 zstd 的線上手冊:

man zstd

參考資料:Tecmint