本篇介如何在 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
的壓縮層級範圍是 1
到 19
,預設值是 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