Zstandard ,簡稱zstd
,是一種快速無損壓縮演算法,針對 zlib 等級的即時壓縮場景和更好的壓縮比。它由 Huff0 和 FSE 庫提供的非常快速的熵階段所支援。
Zstandard 的格式穩定並記錄在 RFC8878 中。多個獨立的實作已經可用。此儲存庫代表參考實現,作為開源雙 BSD 或 GPLv2 許可C庫提供,以及產生和解碼.zst
、 .gz
、 .xz
和.lz4
檔案的命令列實用程式。如果您的專案需要其他程式語言,Zstandard 主頁上提供了已知連接埠和綁定的清單。
開發分支狀態:
作為參考,使用開源記憶體中 lzbench 在配備 Core i7-9700K CPU @ 4.9GHz 並運行 Ubuntu 20.04 ( Linux ubu20 5.15.0-101-generic
) 的桌面上測試和比較了幾種快速壓縮演算法@inikep 在Silesia 壓縮演算法語料庫上使用gcc 9.4.0 編譯的基準測試。
壓縮機名稱 | 比率 | 壓縮 | 解壓縮。 |
---|---|---|---|
zstd 1.5.6 -1 | 2.887 | 510MB/秒 | 1580MB/秒 |
zlib 1.2.11 -1 | 2.743 | 95MB/秒 | 400MB/秒 |
布羅特利 1.0.9 -0 | 2.702 | 395MB/秒 | 430MB/秒 |
zstd 1.5.6 --fast=1 | 2.437 | 545MB/秒 | 1890MB/秒 |
zstd 1.5.6 --fast=3 | 2.239 | 650MB/秒 | 2000MB/秒 |
Quicklz 1.5.0 -1 | 2.238 | 525MB/秒 | 750MB/秒 |
lzo1x 2.10 -1 | 2.106 | 650MB/秒 | 825MB/秒 |
lz4 1.9.4 | 2.101 | 700MB/秒 | 4000MB/秒 |
lzf 3.6 -1 | 2.077 | 420MB/秒 | 830MB/秒 |
活潑 1.1.9 | 2.073 | 530MB/秒 | 1660MB/秒 |
使用--fast=#
指定的負壓縮等級以犧牲壓縮比為代價提供更快的壓縮和解壓縮速度。
Zstd 還可以以犧牲壓縮速度為代價提供更強的壓縮比。速度與壓縮的權衡可以透過小增量進行配置。解壓縮速度得以保留,並且在所有設定下都保持大致相同,這是大多數 LZ 壓縮演算法(例如 zlib 或 lzma)所共享的屬性。
以下測試在運行 Linux Debian( Linux version 4.14.0-3-amd64
)、Core i7-6700K CPU @ 4.0GHz 的伺服器上運行,使用 lzbench,這是@inikep 使用 gcc 編譯的開源內存基準測試7.3.0,西里西亞壓縮語料庫。
壓縮速度與比率 | 減壓速度 |
---|---|
其他一些演算法可以以較慢的速度產生更高的壓縮比,落在圖表之外。若要查看包含慢速模式的大圖,請按一下此連結。
前面的圖表提供了適用於典型檔案和流程場景的結果(幾個 MB)。小數據帶來不同的視角。
壓縮的資料量越小,壓縮就越困難。這個問題對於所有壓縮演算法來說都是常見的,原因是壓縮演算法從過去的資料中學習如何壓縮未來的資料。但在新資料集開始時,沒有「過去」可供建構。
為了解決這種情況,Zstd 提供了一種訓練模式,可用於針對選定類型的資料調整演算法。訓練 Zstandard 是透過提供一些樣本(每個樣本一個檔案)來實現的。訓練的結果儲存在一個名為「字典」的檔案中,在壓縮和壓縮之前必須載入該檔案。使用該字典,小數據可實現的壓縮率顯著提高。
以下範例使用從 github 公共 API 建立的github-users
範例集。它由大約 10K 筆記錄組成,每筆記錄重約 1KB。
壓縮比 | 壓縮速度 | 減壓速度 |
---|---|---|
這些壓縮增益是在提供更快的壓縮和解壓縮速度的同時實現的。
如果一系列小數據樣本之間存在某種相關性,那麼訓練就有效。字典的資料越具體,它的效率就越高(沒有通用字典)。因此,為每種資料類型部署一個字典將帶來最大的好處。字典增益在前幾 KB 最有效。然後,壓縮演算法將逐漸使用先前解碼的內容來更好地壓縮檔案的其餘部分。
創建字典
zstd --train FullPathToTrainingSet/* -o dictionaryName
用字典壓縮
zstd -D dictionaryName FILE
用字典解壓
zstd -D dictionaryName --decompress FILE.zst
make
是該專案官方維護的建置系統。所有其他建置系統都是「相容的」並且由第三方維護,它們在高級選項中可能存在細微差別。當您的系統允許時,最好使用make
來建置zstd
和libzstd
。
如果您的系統相容於標準make
(或gmake
),則在根目錄中呼叫make
將在根目錄中產生zstd
cli。它也會將libzstd
建立到lib/
中。
其他可用選項包括:
make install
:建立並安裝 zstd cli、函式庫和手冊頁make check
:建立並執行zstd
,在本機平台上測試其行為Makefile
遵循 GNU 標準 Makefile 約定,允許分階段安裝、標準標誌、目錄變數和命令變數。
對於進階用例,控制二進位產生的專用編譯標誌會記錄在libzstd
函式庫的lib/README.md
中以及zstd
CLI 的programs/README.md
。
build/cmake
中提供了cmake
項目產生器。它可以產生 Makefile 或其他建置腳本來建立zstd
二進位檔案以及libzstd
動態和靜態函式庫。
預設情況下, CMAKE_BUILD_TYPE
設定為Release
。
透過使用 CMake 的 Universal2 支持,可以建置和安裝zstd
,同時支援 Apple Silicon (M1/M2) 和 Intel。若要執行 Fat/Universal2 建置並安裝,請使用下列命令:
cmake -B build-cmake-debug -S build/cmake -G Ninja -DCMAKE_OSX_ARCHITECTURES= " x86_64;x86_64h;arm64 "
cd build-cmake-debug
ninja
sudo ninja install
build/meson
中提供了 Meson 專案。請按照該目錄中的建置說明進行操作。
您也可以查看.travis.yml
文件,以了解如何使用 Meson 建立此專案的範例。
請注意,預設建置類型是release 。
您可以建置並安裝 zstd vcpkg 依賴項管理器:
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install zstd
vcpkg 中的 zstd 連接埠由 Microsoft 團隊成員和社群貢獻者保持最新。如果版本已過時,請在 vcpkg 儲存庫上建立問題或拉取要求。
您可以安裝 zstd 的預先建置二進位檔案或使用 Conan 從原始程式碼建置它。使用以下命令:
conan install --requires= " zstd/[*] " --build=missing
zstd Conan 配方由 Conan 維護者和社區貢獻者保持最新。如果版本已過時,請在 ConanCenterIndex 儲存庫上建立問題或拉取要求。
進入build
目錄,您會發現其他可能性:
build/VS_scripts
中,它將建置zstd
cli 和libzstd
函式庫,而無需開啟 Visual Studio 解決方案。您可以透過 Buck 建立 zstd 二進位文件,方法是從儲存庫的根目錄執行: buck build programs:zstd
。輸出二進位檔案將位於buck-out/gen/programs/
中。
您可以使用 Bazel 中央儲存庫上託管的模組輕鬆地將 zstd 整合到您的 Bazel 專案中。
您可以透過執行make check
來執行快速的本機冒煙測試。如果無法使用make
,請從src/tests
目錄執行playTest.sh
腳本。測試腳本需要兩個環境變數$ZSTD_BIN
和$DATAGEN_BIN
來定位zstd
和datagen
二進位。有關 CI 測試的信息,請參閱TESTING.md
。
Zstandard 目前部署在 Facebook 和許多其他大型雲端基礎架構中。它會連續運行以壓縮多種格式和用例的大量資料。 Zstandard 被認為對於生產環境是安全的。
Zstandard 在 BSD 或 GPLv2 下獲得雙重許可。
dev
分支是在release
之前合併所有貢獻的分支。如果您打算提出補丁,請提交到dev
分支或其自己的功能分支。不允許直接提交release
。欲了解更多信息,請閱讀貢獻。