项目简介
Zstandard(简称 zstd)是一种快速无损压缩算法,面向实时压缩场景,压缩率达到 zlib 级别甚至更高。其后端有非常快的熵编码阶段,由 Huff0 与 FSE 库[1] 提供。
Zstandard 的格式已稳定,并记录在 RFC8878[2] 中。已有多种独立实现。本仓库是参考实现,以开源双许可(BSD或GPLv2)的 C 库形式提供,并附带命令行工具,可生成和解析 .zst、.gz、.xz 和 .lz4 文件。若项目需要其他编程语言,可在 Zstandard 主页[3] 查看已知移植与绑定列表。
基准测试
作为参考,在一台配备 Core i7-9700K @ 4.9GHz、运行 Ubuntu 24.04(Linux 6.8.0-53-generic)的台式机上,使用 @inikep[4] 的开源内存基准工具 lzbench[5](以 gcc[6] 14.2.0 编译),在 Silesia 压缩语料[7] 上对比了若干快速压缩算法。
| zstd 1.5.7 -1 | |||
| zlib[8] | |||
| zstd 1.5.7 --fast=1 | |||
| zstd 1.5.7 --fast=4 | |||
| lz4[9] | |||
负压缩级别(用 --fast=# 指定)以牺牲压缩比为代价,提供更快的压缩与解压速度。
Zstd 也可以用更慢的压缩速度换取更高压缩比。速度与压缩比可按很小的步进配置。解压速度在各档位下大致保持不变——这是多数 LZ 类算法(如 zlib 或 lzma)共有的特性。
以下测试在一台运行 Linux Debian(Linux version 4.14.0-3-amd64)、配备 Core i7-6700K @ 4.0GHz 的服务器上进行,同样使用 lzbench(gcc 7.3.0)与 Silesia 语料。
另有一些算法能以更慢速度达到更高压缩比,未画入上图。包含慢速模式的更大图见 此链接[10]。
小数据压缩的理由
上图结果适用于典型文件/流场景(数 MB 级)。小数据则是另一回事。
待压缩数据越少,越难压。这是所有压缩算法的共性:算法要从“过去的数据”学习如何压缩“未来的数据”,而新数据集开头并没有可用的“过去”。
为此,Zstd 提供 训练模式,可针对特定类型的数据调优算法。训练方式是提供若干样本(每个样本一个文件),结果保存为称为“字典”的文件,压缩与解压前都需加载该字典。使用字典后,小数据上的压缩比会显著提高。
下面的例子使用 github-users样本集[11](来自 GitHub 公开 API[12]),约 1 万条记录,每条约 1KB。
这些压缩收益同时带来更快的压缩与解压速度。
训练在一族小样本之间存在相关性时才有效。字典越针对具体数据类型,效果越好(不存在“万能字典”)。因此,按数据类型分别部署字典收益最大。字典收益主要体现在前几个 KB;之后算法会逐渐利用已解码内容来更好地压缩文件剩余部分。
字典压缩用法:
创建字典
zstd --train FullPathToTrainingSet/* -o dictionaryName使用字典压缩
zstd -D dictionaryName FILE使用字典解压
zstd -D dictionaryName --decompress FILE.zst
项目地址
https://github.com/facebook/zstd
参考资料
Huff0 与 FSE 库: https://github.com/Cyan4973/FiniteStateEntropy
RFC8878: https://datatracker.ietf.org/doc/html/rfc8878
Zstandard 主页: https://facebook.github.io/zstd/#other-languages
@inikep: https://github.com/inikep/lzbench
lzbench: https://github.com/inikep/lzbench
gcc: https://gcc.gnu.org/
Silesia 压缩语料: https://sun.aei.polsl.pl//~sdeor/index.php?page=silesia
zlib: https://www.zlib.net/
lz4: https://lz4.github.io/lz4/
此链接: https://github.com/facebook/zstd/blob/dev/doc/images/DCspeed5.png
样本集: https://github.com/facebook/zstd/releases/tag/v1.1.3
GitHub 公开 API: https://developer.github.com/v3/users/#get-all-users