Zstandard,或简称为 zstd
,是一种快速的无损压缩算法,旨在实现 zlib 级别的实时压缩场景和更好的压缩比率。它由一个非常快速的熵阶段支持,由Huff0 和 FSE 库提供。
Zstandard 的格式是稳定的,并已在 RFC8878 中进行文档记录。已经有了多个独立的实现。此仓库代表参考实现,作为一个开源的、双重 BSD 和 GPLv2 许可的 C 库,以及一个命令行工具,用于生成和解码 .zst
、.gz
、.xz
和 .lz4
文件。如果您的项目需要另一种编程语言,可以在 Zstandard 主页 上找到端口和绑定的列表。
开发分支状态
基准测试
参考:在运行 Ubuntu 20.04(《Linux 5.11.0-41-generic》)的台式机上,使用lzbench(由 @inikep 编译的进程内存基准的 open-source)在 i7-9700K CPU @ 4.9GHz 下测试并比较了几个快速压缩算法,在Silesia 压缩语料库上使用 gcc 9.3.0。
压缩器名称 | 比率 | 压缩 | 解压. |
---|---|---|---|
zstd 1.5.1 -1 | 2.887 | 530 MB/s | 1700 MB/s |
zlib 1.2.11 -1 | 2.743 | 95 MB/s | 400 MB/s |
brotli 1.0.9 -0 | 2.702 | 395 MB/s | 450 MB/s |
zstd 1.5.1 --fast=1 | 2.437 | 600 MB/s | 2150 MB/s |
zstd 1.5.1 --fast=3 | 2.239 | 670 MB/s | 2250 MB/s |
quicklz 1.5.0 -1 | 2.238 | 540 MB/s | 760 MB/s |
zstd 1.5.1 --fast=4 | 2.148 | 710 MB/s | 2300 MB/s |
lzo1x 2.10 -1 | 2.106 | 660 MB/s | 845 MB/s |
lz4 1.9.3 | 2.101 | 740 MB/s | 4500 MB/s |
lzf 3.6 -1 | 2.077 | 410 MB/s | 830 MB/s |
snappy 1.1.9 | 2.073 | 550 MB/s | 1750 MB/s |
使用--fast=#
指定的负压缩级别会以压缩比为代价,提供更快的压缩和解压速度(与级别1相比)。
Zstd 也可以以压缩速度为代价,提供更强的压缩比率。速度与压缩之间的权衡可以通过小增量进行配置。解压速度得到保留,并且在所有设置中大致相同,这是与 zlib 或 lzma 等大多数 LZ 压缩算法共有的特性。
以下测试在运行Linux Debian(Linux版本 4.14.0-3-amd64
)的服务器上执行,CPU为Core i7-6700K @ 4.0GHz,使用lzbench,这是@inikep编译的由gcc 7.3.0编译的开源内存基准测试,在Silesia压缩语料库上运行。
压缩速度与比率 | 解压速度 |
---|---|
![]() |
![]() |
一些其他算法可以在较慢的速度下产生更高的压缩率,但会超出图表范围。要查看包括慢速模式的大图,请点击此链接。
小型数据压缩的案例
前面的图表提供了适用于典型文件和流场景(几个MB)的结果。小型数据具有不同的视角。
要压缩的数据量越小,就越难压缩。这个问题是所有压缩算法的共同点,原因是压缩算法通过学习历史数据来压缩未来数据。但是在一个新的数据集开始时,没有“过去”可以依靠。
为了解决这种情况,Zstd提供了一个<强>训练模式强>,可以用来调整算法以匹配所选类型的数据。通过提供几个样本(每个样本一个文件)来训练Zstandard。此训练的结果存储在一个名为“字典”的文件中,压缩和解压前必须加载。使用此字典,小型数据的压缩比率可以显著提高。
以下示例使用从sample set中创建的github-users
,该集合来自github公共API。它由大约10K条记录组成,每条记录约重1KB。
压缩比率 | 压缩速度 | 解压速度 |
---|---|---|
![]() |
![]() |
![]() |
在提供更快的压缩和解压速度的同时,实现了这些压缩增益。
如果一组小型数据样本之间有一些相关性,则培训工作有效。字典越特定,效率越高(没有通用字典)。因此,为每种类型的数据部署一个字典将提供最大的好处。字典的增益在最初的几个KB中最有效。然后,压缩算法将逐渐使用先前解码的内容来更好地压缩文件的其余部分。
字典压缩教程
-
创建字典
zstd --train FullPathToTrainingSet/* -o dictionaryName
-
使用字典进行压缩
zstd -D dictionaryName FILE
-
使用字典解压缩
zstd -D dictionaryName --decompress FILE.zst
构建说明
make
是该项目官方维护的构建系统。所有其他构建系统都是“兼容”的并由第三方维护,它们可能在高级选项方面有一些细微差异。当您的系统允许时,请首选使用 make
来构建 zstd
和 libzstd
。
Makefile
如果您的系统与标准 make
(或 gmake
) 兼容,在根目录中调用 make
将会在根目录中生成 zstd
命令行界面。它还会在 lib/
中创建 libzstd
。
其他可用选项包括
make install
:创建并安装 zstd 命令行界面、库和手册页make check
:创建并运行zstd
,测试其在本地平台上的行为
此 Makefile
遵循 GNU 标准Makefile约定,允许阶段性安装、标准标志、目录变量和命令变量。
对于高级用例,控制二进制生成的特定编译标志在 lib/README.md
(用于 libzstd
库)和 programs/README.md
(用于 zstd
命令行界面)中有文档说明。
cmake
在 build/cmake
中提供了一个 cmake
项目生成器。它可以生成 Makefile 或其他构建脚本以创建 zstd
二进制文件和 libzstd
的动态和静态库。
默认情况下,CMAKE_BUILD_TYPE
被设置为 Release
。
对Fat (Universal2) 输出的支持
zstd
可以使用CMake的Universal2支持同时构建和安装以支持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
Meson
Meson项目包含在build/meson
中。按照该目录中的构建说明进行。
您还可以查看.travis.yml
文件,了解如何使用Meson构建该项目的示例。
注意,默认构建类型是发布。
VCPKG
您可以使用vcpkg依赖关系管理器构建和安装zstd
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install zstd
Microsoft团队成员和社区贡献者维护vcpkg中的zstd端口。如果版本过时,请在vcpkg存储库中创建问题或拉取请求。
Visual Studio (Windows)
在build
目录中,您可以找到更多选项
- Visual Studio 2005、2008和2010的项目。
- VS2010项目与VS2012、VS2013、VS2015和VS2017兼容。
- 由@KrzysFR编写的Visual编译器自动化构建脚本,位于
build/VS_scripts
目录下,可用于无需打开Visual Studio解决方案即可构建zstd
命令行工具和libzstd
库。
Buck
您可以通过执行buck build programs:zstd
来使用buck构建zstd二进制文件。从仓库的根目录开始。生成的二进制文件将位于buck-out/gen/programs/
目录下。
测试
您可以通过运行make check
来执行快速本地冒烟测试。如果您不能使用make
,请从src/tests
目录中执行playTest.sh
脚本。测试脚本需要两个环境变量$ZSTD_BIN
和$DATAGEN_BIN
来定位zstd
和datagen
二进制文件。有关CI测试的信息,请参阅TESTING.md
。
状态
目前Zstandard已经在Facebook和许多其他大型云端基础设施中得到部署。它持续运行以压缩大量数据,包括多种格式和不同用途。Zstandard被认为在生产环境中是安全的。
许可证
贡献
《dev》分支是所有贡献合并前达到《release》的地方。如果你计划提出一个补丁,请将其提交到《dev》分支或其自己的功能分支。不允许直接提交到《release》。有关更多信息,请参阅CONTRIBUTING。