ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Zstandard CLI 完全指南:构建目标、编译变量、字典训练与长距离匹配实战(Cosmopolitan 仓库版)

Zstandard CLI 完全指南:构建目标、编译变量、字典训练与长距离匹配实战(Cosmopolitan 仓库版) 标准库操作系统语言运行时系统编程【免费下载链接】cosmopolitanbuild-once run-anywhere c library项目地址https://gitcode.com/GitHub_Trending/co/cosmopolitan点击查看免费下载本篇技术指南以third_party/zstd/programs/README.md为核心骨架系统讲解 Zstandard 命令行工具zstdCLI的多种构建方式、全套编译开关、命令行参数、字典构建器、基准测试、环境变量与长距离匹配模式并结合 Cosmopolitan 仓库中 zstd 的实际构建文件BUILD.mk与 CLI 主源码zstdcli.c给出源码级佐证。读完本文你将能按需裁剪出最小/最简/纯压缩/纯解压等不同形态的 zstd 二进制熟练使用字典训练提升小数据压缩比并理解--long模式在长距离匹配场景下的收益与代价。仓库中集成的 zstd 版本为 1.5.5见 zstd.h 中ZSTD_VERSION_MAJOR/MINOR/RELEASE的定义其来源为 facebook/zstd 官方参考实现仅调整了文件布局以适配 Cosmopolitan见 README.cosmo。构建目标一个 CLI五种形态Zstandard 的 CLI 可以通过make命令无附加参数直接创建。除此之外Makefile 还提供了多个产生不同变体 CLI 的目标Makefile 目标功能说明zstd默认 CLI支持类似 gzip 的参数包含字典构建器、基准测试模块并支持解压 legacy旧版zstd 格式zstd_nolegacy与zstd相同但不支持 legacy zstd 格式zstd-small面向最小体积优化的 CLI无字典构建器、无基准测试、不支持 legacy zstd 格式zstd-compress只能压缩为 zstd 格式的 CLI 变体基于ZSTD_NODECOMPRESSzstd-decompress只能解压 zstd 格式的 CLI 变体基于ZSTD_NOCOMPRESS在 Cosmopolitan 仓库中zstd 并非使用上游 Makefile 构建而是由 third_party/zstd/BUILD.mk 接入其make体系CLI 二进制产物为o/$(MODE)/third_party/zstd/zstd及其.dbg调试版本同时编译出静态库zstd.a库体覆盖 common、compress、decompress、dictBuilder 与 deprecated 等模块。值得注意的是该构建文件通过CPPFLAGS -DZSTD_MULTITHREAD强制开启了多线程支持与下文HAVE_THREAD编译变量的语义一致。编译变量按需裁剪 CLI 功能zstd的作用范围可以通过修改以下make变量来调整HAVE_THREAD多线程多线程支持在检测到pthread时自动启用。可以通过HAVE_THREAD0关闭多线程make zstd HAVE_THREAD0也可以使用HAVE_THREAD1强制启用多线程。此时若链接阶段既找不到pthread也找不到windows.h库构建将直接失败——这有助于确保该特性不会被静默禁用。ZSTD_LEGACY_SUPPORT旧版格式解码zstd可以解压旧版本 zstd 生成的压缩文件。自 v0.8.0 起所有版本的 zstd 都产生符合格式规范RFC 8878 定义的 Zstandard 格式的帧因此彼此兼容但 v0.8.0 之前的旧版本产生的是不同且不兼容的帧。默认情况下zstd支持解码 v0.4.0 的 legacy 格式即ZSTD_LEGACY_SUPPORT4该值可通过编译变量修改ZSTD_LEGACY_SUPPORT1支持所有 v0.1.0 的格式ZSTD_LEGACY_SUPPORT2支持所有 v0.2.0 的格式以此类推ZSTD_LEGACY_SUPPORT0完全不支持任何 legacy 格式ZSTD_LEGACY_SUPPORT 8等同于0因为 7 之后已不存在 legacy 格式需要特别说明zstd只能解码旧格式无法生成任何 legacy 格式。从源码看该宏在库的解压路径 zstd_decompress.c 中默认定义为0即库本身默认不启用 legacy 支持CLI 层的默认值由构建系统注入在 Cosmopolitan 的 BUILD.mk 中未额外定义该宏因此按库默认行为编译。HAVE_ZLIB.gz 格式支持zstd可以压缩和解压.gz格式文件通过命令--formatgzip指定或者通过名为gzip、gunzip的符号链接触发对应行为。当构建时检测到 zlib 库时.gz支持自动启用make zstd HAVE_ZLIB0 # 禁用 .gz 支持 make zstd HAVE_ZLIB1 # 强制启用找不到 zlib 则链接失败强制启用的意义在于防止特性被静默禁用。HAVE_LZMA.xz / .lzma 格式支持zstd可以压缩和解压.xz、.lzma格式文件分别通过--formatxz、--formatlzma命令指定或通过xz、unxz、lzma、unlzma符号链接触发。检测到 lzma 库时自动启用make zstd HAVE_LZMA0 # 禁用 make zstd HAVE_LZMA1 # 强制启用找不到 lzma 库则链接失败HAVE_LZ4.lz4 格式支持zstd可以压缩和解压.lz4格式文件通过--formatlz4指定或通过lz4、unlz4符号链接触发。检测到 lz4 库时自动启用make zstd HAVE_LZ40 # 禁用 make zstd HAVE_LZ41 # 强制启用找不到 lz4 库则链接失败ZSTD_NOBENCH去除基准测试模块zstdCLI 将不编译内置的基准测试模块有助于产出更小的二进制。对应单元也可以从编译目标中排除。ZSTD_NODICT去除字典构建器zstdCLI 将不编译内置的字典构建器有助于产出更小的二进制。对应单元同样可以从编译目标中排除。ZSTD_NOCOMPRESS纯解压 CLIzstdCLI 将不编译压缩支持生成的二进制只能解压文件可用于产出更小体积。对应的 Makefile 目标即为zstd-decompress。ZSTD_NODECOMPRESS纯压缩 CLIzstdCLI 将不编译解压支持生成的二进制只能压缩文件。对应的 Makefile 目标即为zstd-compress。BACKTRACE运行时回溯zstd在执行出现运行时异常时可以显示栈回溯stack backtrace。默认情况下该特性在某些平台上可能被降级或禁用除非应用额外的编译器指令。排查运行时问题时启用该特性可以提供更多上下文以定位故障位置make zstd BACKTRACE1参数聚合-b1e18i1CLI 支持参数聚合aggregation即多个短参数可以连写例如-b1、-e18、-i1可以合并为-b1e18i1。这在基准测试场景中尤其实用一条命令即可表达从等级 1 测到等级 18每级至少测 1 秒。Symlink 快捷键一个二进制多种身份zstd可以通过符号链接被调用。当符号链接的名称取特定值时会触发对应的行为链接名触发行为zstdmt使用本机全部可用核心进行压缩zcat使用任意受支持格式解压并输出到目标文件gzcat与zstdcat等价gzip若启用 zlib 支持模拟gzip以.gz格式压缩文件默认删除源文件用--keep保留若不支持 zlib 则报错xz若启用 lzma 支持模拟xz以.xz格式压缩默认删除源文件不支持则报错lzma若启用 lzma 支持模拟lzma以.lzma格式压缩默认删除源文件不支持则报错lz4若启用 lz4 支持模拟lz4以.lz4格式压缩不支持则报错unzstd、unlz4解压任意受支持的格式ungz、unxz、unlzma解压对应格式且默认删除源文件用--keep保留在 zstdcli.c 源码中这些链接名被定义为常量如ZSTD_ZSTDMT zstdmt、ZSTD_CAT zstdcat、ZSTD_GZ gzip等CLI 启动时会通过exeNameMatch()检测自身可执行文件名来决定行为模式。字典构建器用小样本训练出高压缩比zstd 提供训练模式training mode用于针对特定类型的数据调优算法。训练时向算法提供少量样本每个文件一个样本训练结果存储在一个字典文件中用-o选项指定输出文件默认名为dictionary该字典必须在压缩和解压前加载。使用字典后小数据可达到的压缩比会显著提升同时压缩与解压速度也更快。字典有效的前提是某一类小数据之间存在相关性不存在万能字典因此按数据类型各部署一个字典能获得最大收益。字典带来的收益主要集中在开头几 KB此后压缩算法会越来越多地依赖先前解码的内容来压缩文件其余部分。CLI 中的三步用法创建字典zstd --train PathToTrainingSet/* -o dictionaryName用字典压缩zstd FILE -D dictionaryName用字典解压zstd --decompress FILE.zst -D dictionaryName字典构建参数源码佐证字典构建在 zstdcli.c 中由三种算法支撑对应 CLI 参数--train-cover[k#,d#,steps#,split#,shrink[#]]使用 cover 算法可传 k、d、steps、split、shrink 参数--train-fastcover[k#,d#,f#,steps#,split#,accel#,shrink[#]]使用 fast cover 算法多出 f频率阈值与 accel加速参数--train-legacy[s#]使用 legacy 算法选择性selectivity默认值为 9配套参数-o DICT指定字典文件名默认dictionary--maxdict#限制字典大小默认 112640 字节即约 110 KB--dictID#强制指定字典 ID默认为随机值从源码常量看默认字典名为dictionary默认最大字典大小g_defaultMaxDictSize为 110 KB默认字典压缩等级g_defaultDictCLevel为 3。算法实现位于 lib/dictBuilder/ 目录下的zdict.c、cover.c、fastcover.c与divsufsort.c。基准测试内存内测速CLI 内置了针对 zstd 的内存内in-memory压缩基准测试模块。测试使用给定的文件名进行文件被读入内存并拼接在一起从而消除 I/O 开销使测试结果更精确。可以传入多个文件名、使用通配符或者配合-r选项传入目录名。基准测试测量压缩比、压缩后大小、压缩速度与解压速度。相关参数-b#对文件做基准测试使用 # 压缩等级默认 3-e#依次测试从-b#到-e#的所有压缩等级默认 1-i#每个被测等级的最小评估时间秒默认 3 秒-B#将文件切成大小为 # 的独立块默认不分块-S每个输入文件输出一条基准测试结果默认输出汇总结果--priorityrt将进程优先级设为实时CLI 完整用法-h/-H全量参数手册完整的选项列表可以通过-h或-H参数获得。下面为-H长帮助输出的完整内容Usage : zstd [args] [FILE(s)] [-o file] FILE : a filename with no FILE, or when FILE is - , read standard input Arguments : -# : # compression level (1-19, default: 3) -d : decompression -D DICT: use DICT as Dictionary for compression or decompression -o file: result stored into file (only 1 output file) -f : overwrite output without prompting, also (de)compress links --rm : remove source file(s) after successful de/compression -k : preserve source file(s) (default) -h/-H : display help/long help and exit Advanced arguments : -V : display Version number and exit -c : write to standard output (even if it is the console) -v : verbose mode; specify multiple times to increase verbosity -q : suppress warnings; specify twice to suppress errors too --no-progress : do not display the progress counter -r : operate recursively on directories --filelist FILE : read list of files to operate upon from FILE --output-dir-flat DIR : processed files are stored into DIR --output-dir-mirror DIR : processed files are stored into DIR respecting original directory structure --[no-]asyncio : use asynchronous IO (default: enabled) --[no-]check : during compression, add XXH64 integrity checksum to frame (default: enabled). If specified with -d, decompressor will ignore/validate checksums in compressed frame (default: validate). -- : All arguments after -- are treated as files Advanced compression arguments : --ultra : enable levels beyond 19, up to 22 (requires more memory) --long[#]: enable long distance matching with given window log (default: 27) --fast[#]: switch to very fast compression levels (default: 1) --adapt : dynamically adapt compression level to I/O conditions --patch-fromFILE : specify the file to be used as a reference point for zstds diff engine -T# : spawns # compression threads (default: 1, 0# cores) -B# : select size of each job (default: 0automatic) --single-thread : use a single thread for both I/O and compression (result slightly different than -T1) --rsyncable : compress using a rsync-friendly method (-B sets block size) --exclude-compressed: only compress files that are not already compressed --stream-size# : specify size of streaming input from stdin --size-hint# optimize compression parameters for streaming input of approximately this size --target-compressed-block-size# : generate compressed block of approximately targeted size --no-dictID : dont write dictID into header (dictionary compression only) --[no-]compress-literals : force (un)compressed literals --formatzstd : compress files to the .zst format (default) --formatgzip : compress files to the .gz format --formatxz : compress files to the .xz format --formatlzma : compress files to the .lzma format --formatlz4 : compress files to the .lz4 format Advanced decompression arguments : -l : print information about zstd compressed files --test : test compressed file integrity -M# : Set a memory usage limit for decompression --[no-]sparse : sparse mode (default: disabled) Dictionary builder : --train ## : create a dictionary from a training set of files --train-cover[k#,d#,steps#,split#,shrink[#]] : use the cover algorithm with optional args --train-fastcover[k#,d#,f#,steps#,split#,accel#,shrink[#]] : use the fast cover algorithm with optional args --train-legacy[s#] : use the legacy algorithm with selectivity (default: 9) -o DICT : DICT is dictionary name (default: dictionary) --maxdict# : limit dictionary to specified size (default: 112640) --dictID# : force dictionary ID to specified value (default: random) Benchmark arguments : -b# : benchmark file(s), using # compression level (default: 3) -e# : test all compression levels successively from -b# to -e# (default: 1) -i# : minimum evaluation time in seconds (default: 3s) -B# : cut file into independent chunks of size # (default: no chunking) -S : output one benchmark result per input file (default: consolidated result) --priorityrt : set process priority to real-time这些默认值在 zstdcli.c 中均有对应定义例如默认压缩等级ZSTDCLI_CLEVEL_DEFAULT 3、非--ultra模式下最高等级ZSTDCLI_CLEVEL_MAX 19、默认线程数ZSTDCLI_NBTHREADS_DEFAULT 1、长距离匹配默认窗口日志g_defaultMaxWindowLog 27。其中--ultra打开后最高可用ZSTD_maxCLevel()库支持的最高等级配合更大内存需求。环境变量ZSTD_CLEVEL 与 ZSTD_NBTHREADSzstd没有将任意参数通过环境变量透传的通用机制——出于安全考量这种用法被有意限制目前仅支持ZSTD_CLEVEL与ZSTD_NBTHREADS两个变量。ZSTD_CLEVEL修改默认压缩等级通常为 3可设为 1 到 19常规范围之间的任意值。ZSTD_NBTHREADS指定压缩使用的线程数默认 1。该功能仅在编译时启用了多线程支持时才存在0表示使用本机检测到的 CPU 核心数。线程数上限被ZSTDMT_NBWORKERS_MAX封顶32 位模式为 6464 位环境为 256。这一机制在无法传参的调用场景中非常有用典型例子是tar --zstd。由于ZSTD_CLEVEL与ZSTD_NBTHREADS只是替换默认压缩等级与默认线程数它们可被对应的命令行参数覆盖-#覆盖压缩等级-T#覆盖线程数。长距离匹配模式--long--long模式专为大距离长匹配设计它针对在很大距离上最大可达窗口大小 128 MiB存在长匹配的文件提升压缩比同时保持压缩速度。启用该模式会把窗口大小设为 128 MiB从而同时增加压缩器与解压器的内存占用。速度表现取决于能否找到长匹配若长匹配稀少压缩速度可能下降而长距离匹配丰富时解压速度通常会提升。理想用例clang 四版本 tar 包以四个 clang 版本3.4.1、3.4.2、3.5.0、3.5.1的 tar 包总大小 244889600 B为例这是长距离匹配的理想场景——每个版本小于 128 MiB窗口内存在大量长距离匹配。文档给出的参考数据如下方法压缩比压缩速度解压速度zstd -15.065284.8 MB/s759.3 MB/szstd -55.826124.9 MB/s674.0 MB/szstd -106.50429.5 MB/s771.3 MB/szstd -1 --long17.426220.6 MB/s1638.4 MB/szstd -5 --long19.661165.5 MB/s1530.6 MB/szstd -10 --long21.94975.6 MB/s1632.6 MB/s在该文件上压缩比显著提升且对压缩速度影响很小解压速度则翻倍。反例Silesia 压缩语料库而在长距离匹配稀少的文件如 Silesia 压缩语料库上压缩速度低等级时很可能恶化压缩比则几乎不变方法压缩比压缩速度解压速度zstd -12.878231.7 MB/s594.4 MB/szstd -1 --long2.929106.5 MB/s517.9 MB/szstd -53.27477.1 MB/s464.2 MB/szstd -5 --long3.31951.7 MB/s371.9 MB/szstd -103.52316.4 MB/s489.2 MB/szstd -10 --long3.56616.2 MB/s415.7 MB/s结论--long适合版本库归档、虚拟机镜像等多个相似大块拼接的数据对随机性较强、缺乏长距离重复的普通数据收益有限甚至得不偿失。该模式的底层实现位于 lib/compress/zstd_ldm.czstd_ldm_geartab.h提供哈希辅助表窗口日志参数默认 27对应 128 MiB 窗口。zstdgrep 与 zstdless直接检索压缩文件zstdgrep是一个可以直接对.zst压缩文件执行grep的实用工具用法与普通grep相同例如zstdgrep pattern file.zst需要留意的是zstdgrep不兼容字典压缩。若要检索用字典压缩的文件需要先用zstd或zstdcat解压再管道给grep例如zstdcat -D dictionary -qc -- file.zst | grep pattern仓库中提供了 zstdgrep 的 shell 脚本实现它通过${ZCAT:-zstdcat}解压后管道给${GREP:-grep}支持-Ezegrep、-Fzfgrep等 grep 选项透传并对-e、-f、-h、--等参数做了专门处理。同目录下的zstdless脚本则提供类似的分页查看能力。二者共同构成不解压即可检索/浏览 .zst 文件的日常运维工具链。小结从构建到使用的完整路径构建默认make生成功能最全的zstd通过zstd-small、zstd-compress、zstd-decompress等目标或ZSTD_NOBENCH、ZSTD_NODICT、ZSTD_NOCOMPRESS、ZSTD_NODECOMPRESS等编译变量裁剪体积与能力HAVE_THREAD、HAVE_ZLIB、HAVE_LZMA、HAVE_LZ4控制外部格式与线程支持ZSTD_LEGACY_SUPPORT控制旧格式解码范围BACKTRACE1便于运行时排障。使用-#/--ultra/--fast/--long控制压缩强度-T#控制线程--format*切换输出格式-D加载字典-b/-e/-i做基准测试ZSTD_CLEVEL/ZSTD_NBTHREADS应对tar --zstd这类无法传参的调用场景。进阶--train*系列按数据族训练专属字典以攻克小数据压缩--long在长距离匹配密集的数据上能同时拿到压缩比与解压速度的双重收益zstdgrep/zstdless让压缩文件像普通文件一样可检索可浏览。在 Cosmopolitan 仓库中这套能力被完整打包为o/$(MODE)/third_party/zstd/zstd可执行文件与zstd.a静态库强制多线程编译读者可在该仓库中直接验证上述所有参数与行为。赞分享标准库操作系统语言运行时系统编程【免费下载链接】cosmopolitanbuild-once run-anywhere c library项目地址https://gitcode.com/GitHub_Trending/co/cosmopolitan点击查看免费下载相关推荐Cosmopolitan 集成下的 Zstandard实时无损压缩算法与字典训练实战指南Cosmopolitan 集成下的 Zstandard实时无损压缩算法与字典训练实战指南 Zstandard简称 zstd 是一款以实时压缩场景为设计目标标准库操作系统语言运行时系统编程Zstandardzstd完全指南快速无损压缩、字典训练与多构建方案实战Zstandardzstd完全指南快速无损压缩、字典训练与多构建方案实战 本篇指南以 Zstandard 项目根目录 README.md https://数据工程Zstandardzstd压缩算法全解析原理、字典训练与构建实战Zstandardzstd压缩算法全解析原理、字典训练与构建实战 Zstandard简称 zstd 是 Facebook 开源的一种快速无损压缩算法网络通信移动开发上一篇favicon-cheat-sheet手工艺独特与创意的图标方案下一篇sebotnet33ts_256.a1h_in1k终极指南从架构解析到图像分类实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表