什么是Zstd
zstd是Facebook在2016年开源的新无损压缩算法,优点是压缩率和压缩/解压缩性能都很突出。
效果对比
压缩率 与 压缩速度,此图来源Zstd官网,为一些经典的压缩算法对比,
Compressor name | Ratio | Compression | Decompress. |
---|---|---|---|
zstd 1.5.6 -1 | 2.887 | 510 MB/s | 1580 MB/s |
https://www.zlib.net/ 1.2.11 -1 | 2.743 | 95 MB/s | 400 MB/s |
brotli 1.0.9 -0 | 2.702 | 395 MB/s | 430 MB/s |
zstd 1.5.6 --fast=1 | 2.437 | 545 MB/s | 1890 MB/s |
zstd 1.5.6 --fast=3 | 2.239 | 650 MB/s | 2000 MB/s |
quicklz 1.5.0 -1 | 2.238 | 525 MB/s | 750 MB/s |
lzo1x 2.10 -1 | 2.106 | 650 MB/s | 825 MB/s |
https://lz4.github.io/lz4/ 1.9.4 | 2.101 | 700 MB/s | 4000 MB/s |
lzf 3.6 -1 | 2.077 | 420 MB/s | 830 MB/s |
snappy 1.1.9 | 2.073 | 530 MB/s | 1660 MB/s |
根据对比,我们看到
Zstd特点
- 全能王:压缩率和压缩/解压速度都不错。
- 训练模式:Zstd 提供了一种新的训练模式,可以使用这种模式对所选数据类型的算法进行调优。训练 Zstandard 是通过提供一些样本(每个样本一个文件)来实现的,训练的结果存储在称为“字典”的文件中,该文件必须在压缩和解压缩之前加载。使用此字典,可以在小数据上实现的压缩率大大提高。
实践
命令行
# 安装
sudo apt-get install -y zstd
命令行使用示例:
将一个文件压缩到一个 .zst 后缀的压缩文件中:
zstd {{file}}
解压缩一个文件:
zstd -d {{file}}.zst
将文件解压缩到标准输出 (stdout):
zstd -dc {{file}}.zst
使用指定的压缩等级来压缩一个文件.0 = 最差,19 = 最好 (默认等级是 3):
zstd -{{level}} {{file}}
使用更多内存 (解压或压缩时) 来得到更高的压缩比:
zstd --ultra -{{level}} {{file}}
SDK演示
这里选取语言为Node.js,Node.js中有几个库可以用来处理Zstandard(zstd)压缩:
- node-zstd: 这是一个Node.js的本地插件,它提供了对Zstandard压缩库的直接访问。它需要C++编译器和Zstandard库来编译和运行。
- zstd-codec: 这个库提供了Zstandard的纯JavaScript实现,以及一个使用WebAssembly的版本。它可以在没有本地依赖的情况下运行。
- zstd-wasm: 这个库是Zstandard的WebAssembly版本,可以在浏览器和Node.js中使用。
- simple-zstd: 这个库提供了一个简单的Zstandard压缩和解压缩的接口,它使用了node-zstd库。
这些库都可以通过npm进行安装。你选择哪个库取决于你的具体需求,例如你是否需要纯JavaScript的实现,或者你是否需要在浏览器中使用Zstandard。
这里演示下zstd-wasm使用方式,zstd-wasm:
const { init, compress, decompress } = require("@bokuweb/zstd-wasm");
(async () => {
await init();
const compressed = compress(Buffer.from("Hello zstd!!"), 10);
console.log(compressed);
const res = decompress(compressed);
console.log(Buffer.from(res).toString()); // Hello zstd!!
})();
示例演示完后,再补充些个人对于压缩的思考。
压缩界的真相
熵值
搞过压缩的朋友,可能会有体会。越相似的内容,压缩效率越大,反之压缩效率低。
同样在Zstd中,如果在一组小的数据样本中存在某种相关性,它的压缩率就比较高,反之,数据相关性不大,无序混乱不相似,则压缩率则偏低,此时即使强如Zstd也是巧妇难为无米之炊。
建议
- 对大数据量的文本压缩场景,zstd是综合考虑压缩率和压缩性能最优的选择。
- 如果追求压缩速度,可以lz4。(可以看这篇快速入门 :【压缩算法-lz4 和 lz4hc】)
- 对小数据量的压缩场景,如果能使用zstd的字典方式,压缩效果更为突出。