ZSTD(1)

名稱
zstd - zstd, zstdmt, unzstd, zstdcat - 壓縮或解壓縮 .zst 檔案

概述
zstd [選項] [-|輸入檔案] [-o 輸出檔案]

zstdmt 等效於 zstd -T0

unzstd 等效於 zstd -d

zstdcat 等效於 zstd -dcf

描述
zstd 是一個快速的無失真壓縮演算法和資料壓縮工具，其命令列語法與 gzip(1) 和 xz(1) 類似。它基於 LZ77 系列演算法，並額外採用了 FSE 和 huff0 熵編碼階段。zstd 提供高度可配置的壓縮速度，從每個核心 > 200 MB/s 的快速模式，到具有出色壓縮率的強力模式。它還具有非常快的解碼器，每個核心的速度 > 500 MB/s，並且在所有壓縮設定下都大致保持穩定。

zstd 的命令列語法總體上與 gzip 類似，但存在以下幾處差異：

•   預設情況下會保留原始檔。可以使用 --rm 命令自動刪除它們。

•   在壓縮單個檔案時，zstd 預設會顯示進度通知和結果摘要。使用 -q 可將其關閉。

•   當命令列有誤時，zstd 會顯示一個簡短的幫助頁面。使用 -q 可將其關閉。

•   zstd 不接受來自控制台的輸入，但當 stdin 不是控制台時，它會接受來自 stdin 的輸入。

•   zstd 不會儲存輸入的檔名或屬性，只儲存其內容。

zstd 會根據所選的操作模式處理每個 file。如果沒有給出 files，或者 file 為 -，則 zstd 從標準輸入讀取，並將處理後的資料寫入標準輸出。如果標準輸出是終端，zstd 將拒絕向其寫入壓縮資料：它會顯示一條錯誤訊息並跳過該檔案。類似地，如果標準輸入是終端，zstd 也將拒絕從中讀取壓縮資料。

除非指定了 --stdout 或 -o，否則 files 會被寫入一個新檔案，其名稱由源 file 名稱派生而來：

•   壓縮時，會在原始檔名後附加 .zst 字尾以得到目標檔名。

•   解壓縮時，會從原始檔名中移除 .zst 字尾以得到目標檔名

  拼接 .zst 檔案
可以將多個 .zst 檔案拼接在一起。zstd 會將這樣拼接而成的檔案當作單個 .zst 檔案進行解壓縮。

選項

  整數字尾與特殊值
在大多數需要整數引數的地方，都支援使用可選的字尾來方便地表示較大的整數。整數與字尾之間不能有空格。

KiB 將整數乘以 1,024（2^10）。Ki、K 和 KB 都可作為 KiB 的同義詞。

MiB 將整數乘以 1,048,576（2^20）。Mi、M 和 MB 都可作為 MiB 的同義詞。

  操作模式
如果給出了多個操作模式選項，則以最後一個為準。

-z, --compress
    壓縮。當未指定操作模式選項，且命令名稱也未隱含其他操作模式時（例如 unzstd 隱含 --decompress），這是預設的操作模式。

-d, --decompress, --uncompress
    解壓縮。

-t, --test
    測試壓縮 files 的完整性。此選項等效於 --decompress --stdout > /dev/null，解壓縮後的資料會被丟棄，並進行校驗和計算以檢查錯誤。不會建立或刪除任何檔案。

-b# 使用壓縮級別 # 對檔案進行基準測試。有關此操作的說明，請參見下方的 BENCHMARK（基準測試）一節。

--train FILES
    使用 FILES 作為訓練集來建立字典。訓練集應包含大量小檔案（> 100 個）。有關此操作的說明，請參見下方的 DICTIONARY BUILDER（字典構建器）一節。

-l, --list
    顯示與 zstd 壓縮檔案相關的資訊，例如大小、壓縮率和校驗和。其中某些欄位可能不可用。此命令的輸出可以通過 -v 修飾符加以擴充。

  操作修飾符

•   -#：選擇 # 壓縮級別 [1-19]（預設值：3）。更高的壓縮級別 通常 會以速度和記憶體為代價換取更高的壓縮率。一條粗略的經驗法則是，壓縮級別每提高 2 級，壓縮速度預計會減半。從技術上講，每個級別都會對映到一組高階引數（這些引數也可以單獨修改，參見下文）。由於壓縮器的行為在很大程度上取決於要壓縮的內容，因此無法保證從一個級別到另一個級別是平滑過渡的。

•   --ultra：解鎖 20 以上（最高 22）的高壓縮級別，這會使用多得多的記憶體。請注意，使用這些級別時，解壓縮也將需要更多記憶體。

•   --fast[=#]：切換到超快壓縮級別。如果沒有給出 =#，則預設為 1。數值越大，壓縮速度越快，但會犧牲一定的壓縮率。如果先前設定過壓縮級別，此設定會將其覆蓋。類似地，如果在 --fast 之後設定了壓縮級別，則會覆蓋此設定。

•   -T#, --threads=#：使用 # 個工作執行緒進行壓縮（預設值：根據物理 CPU 核心數在 1 到 4 之間；參見下方的 ZSTD_NBTHREADS）。如果 # 為 0，則嘗試檢測並使用物理 CPU 核心的數量。在所有情況下，執行緒數都會被限制在 ZSTDMT_NBWORKERS_MAX 以內，該值在 32 位模式下為 64，在 64 位環境下為 256。如果編譯 zstd 時未啟用多執行緒支援，則此修飾符不起作用。

•   --single-thread：使用單個執行緒同時處理 I/O 和壓縮。由於壓縮與 I/O 是序列進行的，這可能會稍慢一些。單執行緒模式的記憶體佔用顯著更低，這對於記憶體有限的系統（例如 32 位系統）可能很有用。

    注 1：當停用多執行緒支援時，這是唯一可用的模式。

    注 2：此模式不同於 -T1，後者會派生 1 個與 I/O 並行的壓縮執行緒。最終的壓縮結果也與 -T1 略有不同。

•   --auto-threads={physical,logical} (default: physical)：當通過 -T0 使用預設執行緒數時，根據檢測到的物理或邏輯核心數量來選擇預設值。

•   --adapt[=min=#,max=#]：zstd 會根據感知到的 I/O 狀況動態調整壓縮級別。可以使用 -v 命令即時觀察壓縮級別的自適應過程。自適應可以被約束在所提供的 min 和 max 級別之間。該特性在與多執行緒以及 --long 模式結合使用時有效。它不適用於 --single-thread。它預設將視窗大小設定為 8 MiB（可手動更改，參見 wlog）。由於動態自適應具有混沌特性，壓縮結果不可復現。

    注：在撰寫本文時，--adapt 與多個工作執行緒（>=2）結合使用時，可能會一直停留在低速狀態。

•   --long[=#]：啟用長距離匹配，其 windowLog 為 #；如果沒有給出 #，則預設為 27。這會增大視窗大小（windowLog）以及壓縮器和解壓縮器的記憶體佔用。此設定旨在提高那些在較大距離上存在長匹配的檔案的壓縮率。

    注意：如果 windowLog 設定為大於 27，則需要向解壓縮器傳遞 --long=windowLog 或 --memory=windowSize。

•   --max：將高階引數設定為最大壓縮。警告：此設定非常慢，並且會佔用大量資源。它不適用於 32 位模式，因此在該模式下被停用。

•   -D DICT：使用 DICT 作為字典來壓縮或解壓縮檔案

•   --patch-from FILE：指定要用作 zstd 差分引擎參考點的檔案。這實際上就是字典壓縮，只是採用了一些方便的引數選擇，即 windowSize > srcSize。

    注意：不能同時使用此選項和 -D。

    注意：如果 chainLog < fileLog（fileLog 即覆蓋整個檔案所需的 windowLog），則會自動啟用 --long 模式。你也可以手動強制啟用它。

    注意：在不超過 15 級的情況下，你可以在 --single-thread 模式下使用 --patch-from，以速度為代價略微提高壓縮率。在 15 級以上使用 “--single-thread” 會導致更低的壓縮率。

    注意：對於 19 級，你可以通過將 --zstd=targetLength= 指定為較大的值（例如 4096），並設定較大的 --zstd=chainLog=，以速度為代價來提高壓縮率。

•   --rsyncable：zstd 會定期同步壓縮狀態，以使壓縮檔案對 rsync 更友好。這對壓縮率的影響可以忽略不計，但可能會影響壓縮速度，在較高速度下會較為明顯，例如當 --rsyncable 與許多並行工作執行緒結合使用時。此特性不適用於 --single-thread。你或許不會想在長距離模式下使用它，因為這會降低同步點的效果，不過實際情況可能因人而異。

•   -C, --[no-]check：新增根據未壓縮資料計算得出的完整性校驗（預設值：啟用）

•   --[no-]content-size：啟用/停用是否將檔案的原始大小放入壓縮檔案的頭部。預設選項為 --content-size（意味著原始大小將被放入頭部）。

•   --no-dictID：不在幀頭部中儲存字典 ID（字典壓縮）。解碼器將不得不依賴關於使用哪個字典的隱式知識，而無法檢查其是否正確。

•   -M#, --memory=#：設定記憶體使用上限。預設情況下，zstd 將 128 MiB 作為解壓縮器允許使用的最大記憶體量，但如有需要，你可以手動在任一方向上覆蓋此值（即可以增大或減小它）。

    在與 --patch-from= 一起使用進行壓縮時，也會用到此值。在這種情況下，此引數會覆蓋字典所允許的最大大小（128 MiB）。

    此外，這還可用於限制字典訓練所用的記憶體。此引數會覆蓋預設的 2 GiB 限制。zstd 將載入訓練樣本直到達到記憶體上限，並忽略其餘部分。

•   --stream-size=#：設定來自流的輸入所承諾的源大小。此值必須精確，因為它將被包含在生成的幀頭部中。不正確的流大小會導致錯誤。此資訊將用於更好地最佳化壓縮引數，從而帶來更好且可能更快的壓縮，尤其是對於較小的源大小。

•   --size-hint=#：在處理來自流的輸入時，zstd 在最佳化壓縮引數時必須猜測源大小會有多大。如果流的大小相對較小，這一猜測可能不準確，從而導致壓縮率高於預期。此特性允許在需要時控制該猜測值。精確的猜測會帶來更好的壓縮率。高估會導致壓縮率略有下降，而低估則可能導致顯著下降。

•   --target-compressed-block-size=#：嘗試生成大約為此大小的壓縮塊。為了接近此目標，較大的塊會被拆分。當接收方能夠利用提前收到的不完整資料時，此特性對於改善延遲尤其有用。此引數定義的是一個寬鬆的目標：壓縮塊會以“平均”達到此大小為目標，但各個塊仍可能更大或更小。啟用此特性在 1 級時最多可使壓縮速度降低約 10%。級別越高，相對速度的下降越小，在更高的設定下則難以察覺。

•   -f, --force：停用輸入和輸出檢查。允許覆蓋現有檔案、從控制台輸入、輸出到 stdout、對連結和塊裝置等進行操作。在解壓縮過程中且輸出目標為 stdout 時，將無法識別的格式原樣透傳。

•   -c, --stdout：寫入標準輸出（即使它是控制台）；保留原始檔案（停用 --rm）。

•   -o FILE：將結果儲存到 FILE。請注意，此操作與 -c 衝突。如果命令列中同時出現這兩個操作，則以最後給出的為準。

•   --[no-]sparse：啟用/停用稀疏檔案系統支援，以使含有大量零位元組的檔案在磁碟上佔用更小的空間。建立稀疏檔案可以節省磁碟空間，並通過減少磁碟 I/O 量來加快解壓縮。預設值：當輸出到檔案時啟用，當輸出為 stdout 時停用。此設定會覆蓋預設值，並可強制在 stdout 上使用稀疏模式。

•   --[no-]pass-through：啟用/停用將未壓縮檔案原樣透傳。在解壓縮過程中啟用透傳時，無法識別的格式將從輸入原樣複製到輸出。預設情況下，當輸出目標為 stdout 且設定了強制（-f）選項時，會進行透傳。

•   --rm：在壓縮或解壓縮成功後刪除原始檔。如果輸出為 stdout，此命令會被靜默忽略。如果與 -o 結合使用，由於這是一項破壞性操作，會觸發確認提示（可用 -f 使其靜默）。

•   -k, --keep：在壓縮或解壓縮成功後保留原始檔。這是預設行為。

•   -r：對目錄進行遞迴操作。它會選中指定目錄及其所有子目錄中的全部檔案。當檔案很多且檔名會超出命令列的最大長度時，這既有助於減少命令列輸入，也可以規避 shell 展開的限制。

•   --filelist FILE：從 FILE 中讀取要處理的檔案列表作為內容。其格式與 ls 的輸出相容，每行一個檔案。

•   --output-dir-flat DIR：生成的檔案會被儲存到目標 DIR 目錄中，而不是與原始檔相同的目錄。請注意，如果來自不同目錄的多個檔案最終具有相同的名稱，此命令可能會引入命名衝突問題。衝突解決機制會確保具有某一名稱的第一個檔案出現在 DIR 中，而在與 -f 結合使用時，則會改為保留最後一個檔案。

•   --output-dir-mirror DIR：與 --output-dir-flat 類似，輸出檔案會被儲存在目標 DIR 目錄之下，但此選項會將輸入的目錄層次結構複製到輸出的 DIR 中。

    如果輸入目錄包含 “..”，則該目錄中的檔案將被忽略。如果輸入目錄是絕對目錄（例如 “/var/tmp/abc”），它將被儲存到 “output-dir/var/tmp/abc” 中。如果有多個輸入檔案或目錄，命名衝突的解決將遵循與 --output-dir-flat 相同的規則。

•   --format=FORMAT：以其他格式進行壓縮和解壓縮。如果編譯時啟用了相應支援，zstd 可以壓縮為其他壓縮演算法格式，或從中解壓縮。可能可用的選項有 zstd、gzip、xz、lzma 和 lz4。如果未提供此類格式，則預設為 zstd。

•   -h/-H, --help：顯示幫助/詳細幫助並退出

•   -V, --version：顯示版本號並立即退出。請注意，由於它會退出，在 -V 之後指定的標誌實際上會被忽略。高階用法：-vV 還會顯示所支援的格式。-vvV 還會顯示 POSIX 支援情況。-qV 將只顯示版本號，適合機器讀取。

•   -v, --verbose：詳細模式，顯示更多資訊

•   -q, --quiet：抑制警告、互動和通知。指定兩次也會抑制錯誤。

•   --no-progress：不顯示進度條，但保留所有其他訊息。

•   --show-default-cparams：根據所提供的壓縮級別和輸入大小，顯示將用於某個特定輸入檔案的預設壓縮引數。如果所提供的檔案不是普通檔案（例如管道），此標誌將輸出用於未知大小輸入的引數。

•   --exclude-compressed：僅壓縮尚未被壓縮的檔案。

•   --：-- 之後的所有引數都被視為檔案

  gzip 操作修飾符
在經由 gzip 符號連結呼叫時，zstd 將支援以下額外的選項來模擬 gzip 的行為：

-n, --no-name
    壓縮檔案時不要儲存原始檔名和時間戳。這是預設選項，因此不會改變程式行為。

--best
    是 -9 選項的別名。

  環境變數
使用環境變數來設定引數會帶來安全方面的影響。因此，這一途徑被有意加以限制。目前僅支援 ZSTD_CLEVEL 和 ZSTD_NBTHREADS。它們分別設定壓縮時使用的預設壓縮級別和執行緒數。

ZSTD_CLEVEL 可用於設定 1 到 19 之間（即“正常”範圍）的級別。如果 ZSTD_CLEVEL 的值不是有效的整數，它將被忽略並給出一條警告訊息。ZSTD_CLEVEL 只是替換預設的壓縮級別（3）。

ZSTD_NBTHREADS 可用於設定 zstd 在壓縮時將嘗試使用的執行緒數。如果 ZSTD_NBTHREADS 的值不是有效的無符號整數，它將被忽略並給出一條警告訊息。ZSTD_NBTHREADS 的預設值為 max(1, min(4, nbCores/4))，且上限為 ZSTDMT_NBWORKERS_MAX==200。必須在編譯 zstd 時啟用多執行緒支援，此變數才會產生任何效果。

這兩者都可以被相應的命令列引數覆蓋：-# 用於壓縮級別，-T# 用於壓縮執行緒數。

高階壓縮選項
zstd 提供 22 個預定義的常規壓縮級別以及快速級別。在內部，壓縮級別會被轉換為多個控制壓縮器行為的高階引數（可以用 --show-default-cparams 觀察這一轉換的結果）。這些高階引數可以使用高階壓縮選項來覆蓋。

  --zstd[=options]:
options 以逗號分隔的列表形式提供。你可以只指定想要更改的選項，其餘的將取自所選的或預設的壓縮級別。可用 options 的列表如下：

strategy=strat, strat=strat
    指定匹配查詢器所使用的策略。

    共有 9 種策略，編號從 1 到 9，從最快到最強：1=ZSTD_fast, 2=ZSTD_dfast, 3=ZSTD_greedy, 4=ZSTD_lazy, 5=ZSTD_lazy2, 6=ZSTD_btlazy2, 7=ZSTD_btopt, 8=ZSTD_btultra, 9=ZSTD_btultra2。

windowLog=wlog, wlog=wlog
    指定匹配距離的最大位數。

    該值越大，找到匹配的機會就越大，這通常會提高壓縮率。它也會增加壓縮器和解壓縮器的記憶體需求。wlog 的最小值為 10（1 KiB），最大值在 32 位平臺上為 30（1 GiB），在 64 位平臺上為 31（2 GiB）。

    注意：如果 windowLog 設定為大於 27，則需要向解壓縮器傳遞 --long=windowLog 或 --memory=windowSize。

hashLog=hlog, hlog=hlog
    指定雜湊表的最大位數。

    更大的雜湊表會減少衝突，這通常會使壓縮更快，但在壓縮過程中需要更多記憶體。

    hlog 的最小值為 6（64 個條目 / 256 B），最大值為 30（10 億個條目 / 4 GiB）。

chainLog=clog, clog=clog
    指定次級搜尋結構的最大位數，其形式取決於所選的 strategy。

    位數越多，找到匹配的機會就越大，這通常會提高壓縮率。它也會降低壓縮速度並增加壓縮的記憶體需求。對於只有主雜湊表的 ZSTD_fast strategy，此選項會被忽略。

    clog 的最小值為 6（64 個條目 / 256 B），最大值在 32 位平臺上為 29（5.12 億個條目 / 2 GiB），在 64 位平臺上為 30（10 億個條目 / 4 GiB）。

searchLog=slog, slog=slog
    以對數刻度指定在雜湊鏈或二叉樹中的最大搜索次數。

    更多的搜尋會增大找到匹配的機會，這通常會提高壓縮率但會降低壓縮速度。

    slog 的最小值為 1，最大值為 “windowLog” - 1。

minMatch=mml, mml=mml
    指定在雜湊表中匹配的最小搜尋長度。

    更大的搜尋長度通常會降低壓縮率，但會提高解壓縮速度。

    mml 的最小值為 3，最大值為 7。

targetLength=tlen, tlen=tlen
    此欄位的影響因所選策略而異。

    對於 ZSTD_btopt、ZSTD_btultra 和 ZSTD_btultra2，它指定使匹配查詢器停止搜尋的最小匹配長度。更大的 targetLength 通常會提高壓縮率但會降低壓縮速度。

    對於 ZSTD_fast，當其 > 0 時會觸發超快模式。該值表示在匹配取樣之間跳過的資料量。其影響是相反的：更大的 targetLength 會提高壓縮速度但會降低壓縮率。

    對於所有其他策略，此欄位沒有影響。

    tlen 的最小值為 0，最大值為 128 KiB。

overlapLog=ovlog, ovlog=ovlog
    確定 overlapSize，即從上一個任務重新載入的資料量。此引數僅在啟用多執行緒時可用。重新載入更多資料會提高壓縮率，但會降低速度。

    ovlog 的最小值為 0，最大值為 9。1 表示“無重疊”，因此任務之間完全獨立。9 表示“完全重疊”，即從上一個任務最多重新載入 windowSize 大小的資料。將 ovlog 減小 1 會使重新載入的資料量減少為原來的一半。例如，8 表示“windowSize/2”，6 表示“windowSize/8”。值 0 比較特殊，表示“預設”：ovlog 由 zstd 自動確定。在這種情況下，ovlog 的取值將在 6 到 9 之間，具體取決於所選的 strat。

ldmHashRateLog=lhrlog, lhrlog=lhrlog
    指定向長距離匹配雜湊表中插入條目的頻率。

    除非啟用了長距離匹配，否則此選項會被忽略。

    更大的值將提高壓縮速度。與預設值偏離太遠很可能會導致壓縮率下降。

    預設值在 4 到 7 之間變化，具體取決於 strategy。

ldmHashLog=lhlog, lhlog=lhlog
    指定用於長距離匹配的雜湊表的最大大小。

    除非啟用了長距離匹配，否則此選項會被忽略。

    更大的雜湊表通常會提高壓縮率，但代價是壓縮過程中佔用更多記憶體以及壓縮速度下降。

    lhlog 的最小值為 6，最大值為 30（預設值：windowLog - ldmHashRateLog）。

ldmMinMatch=lmml, lmml=lmml
    指定長距離匹配中匹配的最小搜尋長度。

    除非啟用了長距離匹配，否則此選項會被忽略。

    過大或過小的值通常都會降低壓縮率。

    lmml 的最小值為 4，最大值為 4096（預設值：32 到 64，具體取決於 strategy）。

ldmBucketSizeLog=lblog, lblog=lblog
    指定用於長距離匹配的雜湊表中每個桶的大小。

    除非啟用了長距離匹配，否則此選項會被忽略。

    更大的桶大小會改善衝突解決，但會降低壓縮速度。

    lblog 的最小值為 1，最大值為 8（預設值：4 到 8，具體取決於 strategy）。

  示例
對於大於 256 KB 的檔案，以下引數會將高階壓縮選項設定為類似於預定義的 19 級：

--zstd=wlog=23,clog=23,hlog=22,slog=6,mml=3,tlen=48,strat=6

  -B#:
指定每個壓縮任務的大小。此引數僅在啟用多執行緒時可用。每個壓縮任務並行執行，因此此值會間接影響活動執行緒的數量。預設任務大小因壓縮級別而異（通常為 4 * windowSize）。-B# 使得手動選擇自定義大小成為可能。請注意，任務大小必須滿足一個透明強制執行的最小值。該最小值為 512 KB 或 overlapSize 中的較大者。不同的任務大小會導致不完全相同的壓縮幀。

字典構建器
zstd 提供 字典 壓縮，這可以大大提高對小檔案和訊息的壓縮效率。可以用一組樣本來訓練 zstd，其結果會被儲存到一個稱為 dictionary（字典）的檔案中。然後，在壓縮和解壓縮時，使用 -D dictionaryFileName 命令引用同一個字典。對與樣本集相似的小檔案的壓縮將得到極大改善。

--train FILEs
    使用 FILEs 作為訓練集來建立字典。理想情況下，訓練集應包含大量樣本（> 100 個），且其總大小通常為目標字典大小的 100 倍（例如，對於 100 KB 的字典約為 10 MB）。--train 可以與 -r 結合使用以指定一個目錄，而不必列出所有檔案，這有助於規避 shell 展開的限制。

    由於字典壓縮主要對小檔案有效，因此預期訓練集只包含小檔案。如果某些樣本恰好很大，則只有這些樣本的前 128 KiB 會被用於訓練。

    如果編譯 zstd 時啟用了執行緒支援（預設），--train 支援多執行緒。可以使用 --train-fastcover 指定額外的高階引數。可以通過 --train-legacy 訪問舊版字典構建器。可以通過 --train-cover 訪問速度較慢的 cover 字典構建器。預設的 --train 等效於 --train-fastcover=d=8,steps=4。

-o FILE
    字典將被儲存到 FILE 中（預設名稱：dictionary）。

--maxdict=#
    將字典限制為指定大小（預設值：112640 位元組）。與通常一樣，數量預設以位元組表示，並且可以使用字尾（如 KB 或 MB）來指定更大的值。

-#  在訓練期間使用 # 壓縮級別（可選）。這將生成更針對所選壓縮級別進行調優的統計資訊，從而使該級別的壓縮率有 小幅 提升。

-B# 將輸入檔案拆分為大小為 # 的塊（預設值：不拆分）

-M#, --memory=#
    限制為訓練而載入的樣本資料量（預設值：2 GB）。請注意，預設值（2 GB）同時也是最大值。當訓練集大小未得到良好控制且可能非常大時，此引數會很有用。由於訓練過程的速度與訓練樣本集的大小直接相關，因此較小的樣本集會帶來更快的訓練。

    當訓練集大於最大記憶體時，CLI 將在可用樣本中隨機選取樣本，直到達到所允許的最大記憶體預算。這樣做是為了通過減輕聚集所帶來的潛在影響來提高字典的相關性，例如避免只選取按修改日期排序或按字母順序排序的列表開頭的檔案。該隨機化過程是確定性的，因此使用相同引數訓練相同的檔案列表將會創建出相同的字典。

--dictID=#
    字典 ID 是一個在本地唯一的 ID。解碼器將使用此值來驗證它所使用的字典是否正確。預設情況下，zstd 會建立一個 4 位元組的隨機數 ID。也可以改為提供一個明確的數字 ID。由字典管理者負責確保不會將同一個 ID 分配給兩個不同的字典。請注意，較小的數字有一個優勢：ID < 256 在壓縮幀頭部中只需 1 位元組，ID < 65536 只需 2 位元組。這相比預設的 4 位元組更有優勢。

    請注意，RFC8878 保留了小於 32768 以及大於或等於 2^31 的 ID，因此它們不應在公開場合使用。

--train-cover[=k#,d=#,steps=#,split=#,shrink[=#]]
    為名為 cover 的預設字典構建器演算法選擇引數。如果未指定 d，則會嘗試 d = 6 和 d = 8。如果未指定 k，則會在 [50, 2000] 範圍內嘗試 steps 個取值。如果未指定 steps，則使用預設值 40。如果未指定 split 或 split <= 0，則使用預設值 100。要求 d <= k。如果未使用 shrink 標誌，則使用 shrinkDict 的預設值 0。如果未指定 shrink，則使用 shrinkDictMaxRegression 的預設值 1。

    選取得分最高的、大小為 k 的片段放入字典。一個片段的得分由所有大小為 d 的子片段的頻率之和計算得出。通常 d 應在 [6, 8] 範圍內，偶爾可高達 16，但當 d <= 8 時演算法執行得更快。k 的合適取值因輸入資料而有很大差異，但一個安全的範圍是 [2 * d, 2000]。如果 split 為 100，則所有輸入樣本都會同時用於訓練和測試，以找到用於構建字典的最優 d 和 k。如果編譯 zstd 時啟用了執行緒支援，則支援多執行緒。啟用 shrink 時，會取一個最小大小的截斷字典，並將其大小翻倍，直到該截斷字典的壓縮率與最大字典的壓縮率相比最多差 shrinkDictMaxRegression%。

    示例：

    zstd --train-cover FILEs

    zstd --train-cover=k=50,d=8 FILEs

    zstd --train-cover=d=8,steps=500 FILEs

    zstd --train-cover=k=50 FILEs

    zstd --train-cover=k=50,split=60 FILEs

    zstd --train-cover=shrink FILEs

    zstd --train-cover=shrink=2 FILEs

--train-fastcover[=k#,d=#,f=#,steps=#,split=#,accel=#]
    與 cover 相同，但帶有額外的引數 f 和 accel，且 split 的預設值不同。如果未指定 split，則會嘗試 split = 75。如果未指定 f，則會嘗試 f = 20。要求 0 < f < 32。如果未指定 accel，則會嘗試 accel = 1。要求 0 < accel <= 10。要求 d = 6 或 d = 8。

    f 是用於跟蹤大小為 d 的子片段頻率的陣列大小的對數。子片段被雜湊到 [0,2^f - 1] 範圍內的一個索引。兩個不同的子片段有可能被雜湊到同一個索引，此時在計算頻率時它們會被視為同一個子片段。使用更高的 f 會減少衝突，但耗時更長。

    示例：

    zstd --train-fastcover FILEs

    zstd --train-fastcover=d=8,f=15,accel=2 FILEs

--train-legacy[=selectivity=#]
    使用舊版字典構建器演算法，並採用給定的字典 selectivity（預設值：9）。selectivity 值越小，字典越密集，從而提高其效率但會降低其可達到的最大大小。也接受 --train-legacy=s=#。

    示例：

    zstd --train-legacy FILEs

    zstd --train-legacy=selectivity=8 FILEs

基準測試
zstd 命令列工具提供了一種基準測試模式，可用於輕鬆找到合適的壓縮引數，或者用於對計算機的效能進行基準測試。zstd -b [FILE(s)] 將使用預設壓縮級別對 zstd 的壓縮和解壓縮排行基準測試。請注意，結果在很大程度上取決於所壓縮的內容。

可以向基準測試傳遞多個檔案，甚至可以用 -r DIRECTORY 傳遞一個目錄。當未提供 FILE 時，基準測試將使用程式化生成的 lorem ipsum 文本。

為了與普通命令列 I/O 的行為保持一致，基準測試預設將使用 max(1, min(4, nbCores/4)) 個工作執行緒。

•   -b#：使用壓縮級別 # 對檔案進行基準測試

•   -e#：使用多個壓縮級別對檔案進行基準測試，從 -b# 到 -e#（含兩端）

•   -d：僅對解壓縮速度進行基準測試（需要提供 zstd 壓縮過的內容）

•   -i#：最短評估時間，以秒為單位（預設值：3 秒），僅用於基準測試模式

•   -B#, --block-size=#：將檔案切分為大小為 # 的獨立塊（預設值：不切分）

•   -S：為每個輸入檔案輸出一個基準測試結果（預設值：彙總結果）

•   -D dictionary：使用字典進行基準測試

•   --priority=rt：將程序優先順序設定為即時（Windows）

除了壓縮級別之外，基準測試還相容其他引數，例如執行緒數（-T#）、高階壓縮引數（--zstd=###）、字典壓縮（-D dictionary），甚至可以停用校驗和驗證等。

輸出格式： 壓縮級別#檔名: 輸入大小 -> 輸出大小 (壓縮率), 壓縮速度, 解壓縮速度

方法： 對於速度測量，整個輸入會在記憶體中被壓縮/解壓縮以測量速度。一次執行至少持續 1 秒，因此當檔案較小時，每次執行會對它們進行多次壓縮/解壓縮，以提高測量的準確性。

參見
zstdgrep(1), zstdless(1), gzip(1), xz(1)

zstandard 格式的規範見於 Y. Collet 所著 “Zstandard Compression and the ‘application/zstd’ Media Type”，https://www.ietf.org/rfc/rfc8878.txt，網際網路 RFC 8878（2021 年 2 月）。

BUGS
請在該網頁報告漏洞：https://github.com/facebook/zstd/issues

作者
Yann Collet

跋
本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃：https://github.com/man-pages-zh/manpages-zh