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

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

Zstandard 壓縮演算法

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

Compressor name Compression Decompress. Compr. size Ratio
memcpy 8657 MB/s 8891 MB/s 211947520 100.00
brotli 2017-03-10 -0 225 MB/s 246 MB/s 78432913 37.01
libdeflate 0.7 -1 117 MB/s 570 MB/s 73318371 34.59
lz4 1.7.5 452 MB/s 2244 MB/s 100880800 47.60
lzf 3.6 -0 244 MB/s 550 MB/s 105682088 49.86
lzo1x 2.09 -1 394 MB/s 551 MB/s 100572537 47.45
snappy 1.1.4 327 MB/s 1075 MB/s 102146767 48.19
zlib 1.2.11 -1 66 MB/s 250 MB/s 77259029 36.45
zstd 1.1.4 -1 242 MB/s 636 MB/s 73654014 34.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