facebook/zstd
GitHub: facebook/zstd
Facebook 开源的快速无损压缩算法,在压缩率和速度之间取得优秀平衡,提供从实时到高压缩率的多档可配置级别。
Stars: 26739 | Forks: 2418

__Zstandard__(简称为 `zstd`)是一种快速的无损压缩算法,
目标是提供 zlib 级别的实时压缩性能以及更好的压缩率。
它由 [Huff0 和 FSE 库](https://github.com/Cyan4973/FiniteStateEntropy) 提供的极快熵阶段支持。
Zstandard 的格式是稳定的,并记录在 [RFC8878](https://datatracker.ietf.org/doc/html/rfc8878) 中。目前已有多种独立的实现可用。
本仓库代表参考实现,以开源双重 [BSD](LICENSE) 或 [GPLv2](COPYING) 许可的 **C** 库形式提供,
以及一个用于生成和解码 `.zst`、`.gz`、`.xz` 和 `.lz4` 文件的命令行工具。
如果您的项目需要其他编程语言,
[Zstandard 主页](https://facebook.github.io/zstd/#other-languages) 上提供了已知端口和绑定的列表。
**开发分支状态:**
[][travisLink]
[][CircleLink]
[][CirrusLink]
[][OSSFuzzLink]
## 基准测试
作为参考,测试并比较了几种快速压缩算法,
测试环境为配备 Core i7-9700K CPU @ 4.9GHz
并运行 Ubuntu 24.04 (`Linux 6.8.0-53-generic`) 的台式机,
使用 @inikep 开发的开源内存基准测试工具 [lzbench],
使用 [gcc] 14.2.0 编译,
基于 [Silesia compression corpus] 数据集。
| 压缩器名称 | 比率 | 压缩 | 解压 |
| --------------- | ------| -----------| ---------- |
| **zstd 1.5.7 -1** | 2.896 | 510 MB/s | 1550 MB/s |
| brotli 1.1.0 -1 | 2.883 | 290 MB/s | 425 MB/s |
| [zlib] 1.3.1 -1 | 2.743 | 105 MB/s | 390 MB/s |
| **zstd 1.5.7 --fast=1** | 2.439 | 545 MB/s | 1850 MB/s |
| quicklz 1.5.0 -1 | 2.238 | 520 MB/s | 750 MB/s |
| **zstd 1.5.7 --fast=4** | 2.146 | 665 MB/s | 2050 MB/s |
| lzo1x 2.10 -1 | 2.106 | 650 MB/s | 780 MB/s |
| [lz4] 1.10.0 | 2.101 | 675 MB/s | 3850 MB/s |
| snappy 1.2.1 | 2.089 | 520 MB/s | 1500 MB/s |
| lzf 3.6 -1 | 2.077 | 410 MB/s | 820 MB/s |
使用 `--fast=#` 指定的负压缩级别,
以牺牲压缩率为代价提供更快的压缩和解压速度。
Zstd 也可以通过降低压缩速度来提供更高的压缩率。
速度与压缩的权衡可以通过小增量进行配置。
解压速度保持不变,在所有设置下大致相同,
这是大多数 LZ 压缩算法(如 [zlib] 或 lzma)共有的特性。
以下测试运行在
运行 Linux Debian (`Linux version 4.14.0-3-amd64`) 的服务器上
配备 Core i7-6700K CPU @ 4.0GHz,
使用 @inikep 开发的开源内存基准测试工具 [lzbench],
使用 [gcc] 7.3.0 编译,
基于 [Silesia compression corpus] 数据集。
压缩速度与比率 | 解压速度
---------------------------|--------------------
 | 
还有少数其他算法可以在较慢的速度下产生更高的压缩率,超出了图表范围。
要查看包含慢速模式的更大图片,[请点击此链接](doc/images/DCspeed5.png)。
## 小数据压缩的案例
前面的图表提供了适用于典型文件和流场景(几 MB)的结果。小数据则有着不同的视角。
要压缩的数据量越小,压缩就越困难。这是所有压缩算法共同面临的问题,原因是压缩算法从过去的数据中学习如何压缩未来的数据。但在新数据集的开始,没有“过去”可供借鉴。
为了解决这种情况,Zstd 提供了 __训练模式__,可用于针对选定的数据类型调整算法。
训练 Zstandard 是通过向其提供一些样本(每个样本一个文件)来实现的。此训练的结果存储在一个名为“字典”的文件中,必须在压缩和解压缩之前加载。
使用此字典,对小数据可达到的压缩率显著提高。
以下示例使用 `github-users` [样本集](https://github.com/facebook/zstd/releases/tag/v1.1.3),该样本集创建自 [github public API](https://developer.github.com/v3/users/#get-all-users)。
它由大约 10K 条记录组成,每条重约 1KB。
压缩率 | 压缩速度 | 解压速度
------------------|-------------------|--------------------
 |  | 
这些压缩增益是在同时提供_更快的_压缩和解压速度的同时实现的。
如果小数据样本系列中存在某种相关性,训练就会起作用。字典针对特定数据的程度越高,其效率就越高(不存在_通用字典_)。
因此,针对每种类型的数据部署一个字典将提供最大的收益。
字典的增益主要在前几 KB 内有效。然后,压缩算法将逐渐使用先前解码的内容来更好地压缩文件的其余部分。
### 字典压缩操作指南:
1. 创建字典
`zstd --train FullPathToTrainingSet/* -o dictionaryName`
2. 使用字典压缩
`zstd -D dictionaryName FILE`
3. 使用字典解压
`zstd -D dictionaryName --decompress FILE.zst`
## 构建说明
`make` 是本项目的主要构建系统。
它是参考标准,其他构建系统会定期更新以保持兼容。
但是,由于难以实现完美同步,可能会存在细微的偏差和功能差异。
因此,当您的构建系统允许时,最好使用 `make`。
### Makefile
假设您的系统支持标准 `make`(或 `gmake`),
只需在根目录中调用 `make` 即可在根目录生成 `zstd` cli,
并在 `lib/` 中生成 `libzstd`。
其他标准目标包括:
- `make install` :安装 zstd cli、库和 man 页面
- `make check` :运行 `zstd`,测试其在本地平台上的基本行为
`Makefile` 遵循 [GNU Standard Makefile 约定](https://www.gnu.org/prep/standards/html_node/Makefile-Conventions.html),
允许分段安装、标准编译标志、目录变量和命令变量。
对于高级用例,控制二进制生成和安装路径的专用标志已记录
在 [`lib/README.md`](lib/README.md#modular-build)(针对 `libzstd` 库)
和 [`programs/README.md`](programs/README.md#compilation-variables)(针对 `zstd` CLI)中。
### cmake
提供了一个 `cmake` 项目生成器,用于生成 Makefiles 或其他构建脚本
以创建 `zstd` 二进制文件以及 `libzstd` 动态和静态库。
仓库根目录现在包含一个最小的 `CMakeLists.txt`,它转发到 `build/cmake`,
因此您可以使用标准的 `cmake -S .` 调用来配置项目,
同时历史悠久的 `cmake -S build/cmake` 入口点仍受到完全支持。
```
cmake -S . -B build-cmake
cmake --build build-cmake
```
默认情况下,`CMAKE_BUILD_TYPE` 设置为 `Release`。
#### 支持 Fat (Universal2) 输出
`zstd` 可以利用 CMake 的 Universal2 支持构建和安装,以同时支持 Apple Silicon (M1/M2) 和 Intel。
要执行 Fat/Universal2 构建和安装,请使用以下命令:
```
cmake -S . -B build-cmake-debug -G Ninja -DCMAKE_OSX_ARCHITECTURES="x86_64;x86_64h;arm64"
cd build-cmake-debug
ninja
sudo ninja install
```
### Meson
[`build/meson`](build/meson) 中提供了 Meson 项目。请遵循
该目录中的构建说明。
您还可以查看 [`.travis.yml`](.travis.yml) 文件,了解
如何使用 Meson 构建此项目的示例。
请注意,默认构建类型为 **release**。
### VCPKG
您可以使用 [vcpkg](https://github.com/Microsoft/vcpkg/) 依赖管理器构建和安装 zstd:
```
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install zstd
```
vcpkg 中的 zstd 端口由 Microsoft 团队成员和社区贡献者保持最新。
如果版本过时,请在 vcpkg 仓库上[创建 issue 或 pull request](https://github.com/Microsoft/vcpkg)。
### Conan
您可以使用 [Conan](https://conan.io/) 安装 zstd 的预构建二进制文件或从源代码构建它。使用以下命令:
```
conan install --requires="zstd/[*]" --build=missing
```
zstd Conan recipe 由 Conan 维护者和社区贡献者保持最新。
如果版本过时,请在 ConanCenterIndex 仓库上[创建 issue 或 pull request](https://github.com/conan-io/conan-center-index)。
### Visual Studio (Windows)
进入 `build` 目录,您将发现更多可能性:
- Visual Studio 2008 和 2010 的项目。
+ VS2010 项目兼容 VS2012、VS2013、VS2015 和 VS2017。
- [@KrzysFR](https://github.com/KrzysFR) 提供的 Visual 编译器自动构建脚本,位于 `build/VS_scripts` 中,
它将构建 `zstd` cli 和 `libzstd` 库,无需打开 Visual Studio 解决方案。
- 现在建议从 `cmake` 生成 Visual Studio 解决方案
### Buck
您可以通过 buck 构建 zstd 二进制文件,方法是从仓库的根目录执行:`buck build programs:zstd`。
输出二进制文件将位于 `buck-out/gen/programs/` 中。
### Bazel
您可以使用托管在 [Bazel Central Repository](https://registry.bazel.build/modules/zstd) 上的模块将 zstd 集成到您的 Bazel 项目中。
## 测试
您可以通过运行 `make check` 来运行快速的本地冒烟测试。
如果您无法使用 `make`,请从 `src/tests` 目录执行 `playTest.sh` 脚本。
测试脚本需要两个环境变量 `$ZSTD_BIN` 和 `$DATAGEN_BIN` 来定位 `zstd` 和 `datagen` 二进制文件。
有关 CI 测试的信息,请参阅 `TESTING.md`。
## 状态
Zstandard 已部署在 Meta 和许多其他大型云基础设施中,
用于压缩各种格式和用例的海量数据。
它还通过 Google 的 [oss-fuzz](https://github.com/google/oss-fuzz/tree/master/projects/zstd) 程序持续进行安全模糊测试。
## 许可证
Zstandard 采用双重许可:[BSD](LICENSE) 或 [GPLv2](COPYING)。
## 贡献
`dev` 分支是所有贡献在到达 `release` 之前合并的地方。
不允许直接提交到 `release`。
有关更多信息,请阅读 [CONTRIBUTING](CONTRIBUTING.md)。
标签:Bash脚本, Facebook, FSE, Huff0, zlib替代, Zstandard, zstd, 传输优化, 压缩工具, 压缩算法, 实时压缩, 客户端加密, 客户端加密, 开源库, 搜索引擎爬虫, 数据压缩, 文件处理, 无损压缩, 熵编码, 算法实现, 预握手