阅读,与值得关注的内容Readance

比 zip 更快、比 gzip 更狠:Meta 开源压缩神器 zstd

项目简介

Zstandard(简称 zstd)是一种快速无损压缩算法,面向实时压缩场景,压缩率达到 zlib 级别甚至更高。其后端有非常快的熵编码阶段,由 Huff0 与 FSE 库[1] 提供。

Zstandard 的格式已稳定,并记录在 RFC8878[2] 中。已有多种独立实现。本仓库是参考实现,以开源双许可(BSD或GPLv2)的 C 库形式提供,并附带命令行工具,可生成和解析 .zst、.gz、.xz 和 .lz4 文件。若项目需要其他编程语言,可在 Zstandard 主页[3] 查看已知移植与绑定列表。

基准测试

作为参考,在一台配备 Core i7-9700K @ 4.9GHz、运行 Ubuntu 24.04(Linux 6.8.0-53-generic)的台式机上,使用 @inikep[4] 的开源内存基准工具 lzbench[5](以 gcc[6] 14.2.0 编译),在 Silesia 压缩语料[7] 上对比了若干快速压缩算法。

压缩器名称
压缩比
压缩速度
解压速度
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[8]
 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[9]
 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 @ 4.0GHz 的服务器上进行,同样使用 lzbench(gcc 7.3.0)与 Silesia 语料。

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

另有一些算法能以更慢速度达到更高压缩比,未画入上图。包含慢速模式的更大图见 此链接[10]。

小数据压缩的理由

上图结果适用于典型文件/流场景(数 MB 级)。小数据则是另一回事。

待压缩数据越少,越难压。这是所有压缩算法的共性:算法要从“过去的数据”学习如何压缩“未来的数据”,而新数据集开头并没有可用的“过去”。

为此,Zstd 提供 训练模式,可针对特定类型的数据调优算法。训练方式是提供若干样本(每个样本一个文件),结果保存为称为“字典”的文件,压缩与解压前都需加载该字典。使用字典后,小数据上的压缩比会显著提高。

下面的例子使用 github-users样本集[11](来自 GitHub 公开 API[12]),约 1 万条记录,每条约 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

项目地址

https://github.com/facebook/zstd

参考资料

[1] 

Huff0 与 FSE 库: https://github.com/Cyan4973/FiniteStateEntropy

[2] 

RFC8878: https://datatracker.ietf.org/doc/html/rfc8878

[3] 

Zstandard 主页: https://facebook.github.io/zstd/#other-languages

[4] 

@inikep: https://github.com/inikep/lzbench

[5] 

lzbench: https://github.com/inikep/lzbench

[6] 

gcc: https://gcc.gnu.org/

[7] 

Silesia 压缩语料: https://sun.aei.polsl.pl//~sdeor/index.php?page=silesia

[8] 

zlib: https://www.zlib.net/

[9] 

lz4: https://lz4.github.io/lz4/

[10] 

此链接: https://github.com/facebook/zstd/blob/dev/doc/images/DCspeed5.png

[11] 

样本集: https://github.com/facebook/zstd/releases/tag/v1.1.3

[12] 

GitHub 公开 API: https://developer.github.com/v3/users/#get-all-users

前往微信阅读全文

内容来自公众号,可前往微信查看原文。

查看作者的更多文章 →