Facebook/ZStandard-快速实时压缩算法

2020-10-08 12:22:00

ZStandard,或简称为zstd,是一种快速无损压缩算法,目标是zlib级的实时压缩场景和更高的压缩比。它得到了由Huff0和FSE库提供的非常快的熵级的支持。

该项目以开源的双BSD和GPLv2许可的C库和命令行实用程序的形式提供,用于生成和解码.zst、.gz、.xz和.lz4文件。如果您的项目需要另一种编程语言,请在ZStandard主页上提供已知端口和绑定的列表。

作为参考,在Silesia压缩语料库上,在运行Arch Linux(Linux5.5.11-arch1-1版)、Core [email protected] GHz的服务器上,使用lzbench(由@inikep编写的开源内存基准测试程序,用GCC 9.3.0编译)对几种快速压缩算法进行了测试和比较。

负压缩级别(用--fast=#指定)与级别1相比,提供更快的压缩和解压缩速度,以换取一定的压缩比损失,如上表所示。

Zstd还可以以压缩速度为代价提供更强的压缩比。速度与压缩之间的权衡可以通过小增量进行配置。解压缩速度将保持不变,并在所有设置下保持大致相同,这是大多数LZ压缩算法(如zlib或lzma)共有的属性。

以下测试在运行Linux Debian(Linux版本4.14.0-3-amd64)的服务器上运行,核心为[email protected] GHz,在Silesia压缩语料库上运行lzbench,这是一个由@inikep用GCC 7.3.0编译的开源内存基准测试。

其他一些算法可以在速度较慢的情况下产生较高的压缩比,这些算法位于图形之外。要查看包括慢速模式在内的更大图片,请单击此链接。

前面的图表提供了适用于典型文件和流方案(几MB)的结果。小数据伴随着不同的视角。

要压缩的数据量越小,压缩就越困难。这个问题对所有压缩算法都是常见的,原因是压缩算法从过去的数据中学习如何压缩未来的数据。但在新数据集的开始,没有过去的数据可供参考。

为了解决这种情况,Zstd提供了一种训练模式,可以用来针对选定的数据类型调整算法,通过提供几个样本(每个样本一个文件)来实现对Z标准的训练。此培训的结果存储在名为DICTIONARY的文件中,该文件必须在压缩和解压缩之前加载。使用此字典,可以在小数据上实现的压缩比显著提高。

下面的示例使用从GitHub公共API创建的GitHub-Users示例集。它由大约10K个记录组成,每个记录重约1KB。

如果在一个小数据样本族中存在某种相关性,则训练是有效的。字典越特定于数据,效率就越高(没有通用字典)。因此,每种数据类型部署一个字典将带来最大的好处。字典收益在最初的几个KB中最有效。然后,压缩算法将逐渐使用先前解码的内容来更好地压缩文件的其余部分。

如果您的系统与标准make(或gmake)兼容,则在根目录中调用make将在根目录中生成zstd cli。

在build/cmake中提供了一个cmake项目生成器,它可以生成makefile或其他构建脚本来创建zstd二进制文件,以及libzstd动态库和静态库。

您还可以查看.travis.yml文件,获取有关如何使用介子构建此项目的示例。

Vcpkg中的zstd端口由Microsoft团队成员和社区贡献者保持最新。如果版本已过期,请在vcpkg存储库上创建问题或拉回请求。

由@KrzysFR在build/vs_scripts中为Visual编译器自动构建脚本,它将构建zstd cli和libzstd库,而无需打开Visual Studio解决方案。

您可以通过buck从报告的根目录执行:buck build Programs:zstd来构建zstd二进制文件,输出的二进制文件将位于buck-out/gen/Programs/中。

您可以通过从src/test目录执行playTest.sh脚本来快速运行本地烟雾测试。测试脚本需要两个环境变量$ZSTD_BIN和$DataGen_BIN来定位zstd和DataGen二进制文件。有关CI测试的信息,请参阅TESTING.md。

ZStandard目前部署在Facebook内部。它被连续使用来压缩多种格式的大量数据和使用案例。Z标准被认为对生产环境是安全的。

第#34;dev&34;分支是在达到";master";之前合并所有贡献的分支。如果您计划建议修补程序,请提交到";dev&34;分支或其自己的功能分支。不允许直接提交到";master";。有关更多信息,请阅读贡献。