facebook/zstd

GitHub: facebook/zstd

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

Stars: 26739 | Forks: 2418

Zstandard

__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) 上提供了已知端口和绑定的列表。 **开发分支状态:** [![Build Status](https://api.travis-ci.com/facebook/zstd.svg?branch=dev)][travisLink] [![Build status](https://circleci.com/gh/facebook/zstd/tree/dev.svg?style=shield)][CircleLink] [![Build status](https://api.cirrus-ci.com/github/facebook/zstd.svg?branch=dev)][CirrusLink] [![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/zstd.svg)][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] 数据集。 压缩速度与比率 | 解压速度 ---------------------------|-------------------- ![Compression Speed vs Ratio](doc/images/CSpeed2.png "Compression Speed vs Ratio") | ![Decompression Speed](doc/images/DSpeed3.png "Decompression Speed") 还有少数其他算法可以在较慢的速度下产生更高的压缩率,超出了图表范围。 要查看包含慢速模式的更大图片,[请点击此链接](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。 压缩率 | 压缩速度 | 解压速度 ------------------|-------------------|-------------------- ![Compression Ratio](doc/images/dict-cr.png "Compression Ratio") | ![Compression Speed](doc/images/dict-cs.png "Compression Speed") | ![Decompression Speed](doc/images/dict-ds.png "Decompression Speed") 这些压缩增益是在同时提供_更快的_压缩和解压速度的同时实现的。 如果小数据样本系列中存在某种相关性,训练就会起作用。字典针对特定数据的程度越高,其效率就越高(不存在_通用字典_)。 因此,针对每种类型的数据部署一个字典将提供最大的收益。 字典的增益主要在前几 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, 传输优化, 压缩工具, 压缩算法, 实时压缩, 客户端加密, 客户端加密, 开源库, 搜索引擎爬虫, 数据压缩, 文件处理, 无损压缩, 熵编码, 算法实现, 预握手