libzstd 1.5.5

libzstd 1.5.5

Crazy凡 维护。



libzstd 1.5.5

  • kongkaikai

Zstandard

Zstandard,或简称为 zstd,是一种快速的无损压缩算法,旨在实现 zlib 级别的实时压缩场景和更好的压缩比率。它由一个非常快速的熵阶段支持,由Huff0 和 FSE 库提供。

Zstandard 的格式是稳定的,并已在 RFC8878 中进行文档记录。已经有了多个独立的实现。此仓库代表参考实现,作为一个开源的、双重 BSDGPLv2 许可的 C 库,以及一个命令行工具,用于生成和解码 .zst.gz.xz.lz4 文件。如果您的项目需要另一种编程语言,可以在 Zstandard 主页 上找到端口和绑定的列表。

开发分支状态

Build Status Build status Build status Fuzzing Status

基准测试

参考:在运行 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压缩语料库上运行。

压缩速度与比率 解压速度
Compression Speed vs Ratio Decompression Speed

一些其他算法可以在较慢的速度下产生更高的压缩率,但会超出图表范围。要查看包括慢速模式的大图,请点击此链接

小型数据压缩的案例

前面的图表提供了适用于典型文件和流场景(几个MB)的结果。小型数据具有不同的视角。

要压缩的数据量越小,就越难压缩。这个问题是所有压缩算法的共同点,原因是压缩算法通过学习历史数据来压缩未来数据。但是在一个新的数据集开始时,没有“过去”可以依靠。

为了解决这种情况,Zstd提供了一个<强>训练模式,可以用来调整算法以匹配所选类型的数据。通过提供几个样本(每个样本一个文件)来训练Zstandard。此训练的结果存储在一个名为“字典”的文件中,压缩和解压前必须加载。使用此字典,小型数据的压缩比率可以显著提高。

以下示例使用从sample set中创建的github-users,该集合来自github公共API。它由大约10K条记录组成,每条记录约重1KB。

压缩比率 压缩速度 解压速度
Compression Ratio Compression Speed Decompression Speed

在提供更快的压缩和解压速度的同时,实现了这些压缩增益。

如果一组小型数据样本之间有一些相关性,则培训工作有效。字典越特定,效率越高(没有通用字典)。因此,为每种类型的数据部署一个字典将提供最大的好处。字典的增益在最初的几个KB中最有效。然后,压缩算法将逐渐使用先前解码的内容来更好地压缩文件的其余部分。

字典压缩教程

  1. 创建字典

    zstd --train FullPathToTrainingSet/* -o dictionaryName

  2. 使用字典进行压缩

    zstd -D dictionaryName FILE

  3. 使用字典解压缩

    zstd -D dictionaryName --decompress FILE.zst

构建说明

make 是该项目官方维护的构建系统。所有其他构建系统都是“兼容”的并由第三方维护,它们可能在高级选项方面有一些细微差异。当您的系统允许时,请首选使用 make 来构建 zstdlibzstd

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来定位zstddatagen二进制文件。有关CI测试的信息,请参阅TESTING.md

状态

目前Zstandard已经在Facebook和许多其他大型云端基础设施中得到部署。它持续运行以压缩大量数据,包括多种格式和不同用途。Zstandard被认为在生产环境中是安全的。

许可证

Zstandard以BSDGPLv2双重授权。

贡献

《dev》分支是所有贡献合并前达到《release》的地方。如果你计划提出一个补丁,请将其提交到《dev》分支或其自己的功能分支。不允许直接提交到《release》。有关更多信息,请参阅CONTRIBUTING