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
。欲了解更多信息,请阅读贡献。