Zstandard (zst) 到底是什么?Facebook 的压缩算法
Zstandard 到底是什么:简短版
Zstandard(常缩写为 zstd,文件扩展名为 .zst)是 Facebook(现为 Meta)的 Yann Collet 开发的一种无损数据压缩算法。它于 2016 年作为开源项目发布,并迅速站稳脚跟;Linux 内核在 5.16 版本中就采用了它。Facebook 自身在其庞大的基础设施中广泛依赖 zstd,从数据库快照到日志文件,无所不压。该格式现已成为官方互联网标准,并在 RFC 8878 中有完整的文档记录。 在底层,zstd 结合了基于字典的 LZ77 方法和一种名为非对称数字系统 (ANS) 的现代熵编码器。实际上,这意味着它能够以惊人的速度压缩和解压缩数据,与那些较慢、更传统的算法相比,通常不会牺牲太多压缩率。 .zst 扩展名表示单流压缩格式。你还会看到 .tar.zst,它只是一个用 zstd 压缩的 tar 归档文件,就像我们熟悉的 .tar.gz 或 .tar.bz2 一样。如果你最近下载过 Linux 软件包、数据库备份或大型数据集,很有可能它就是 .zst 或 .tar.zst 文件。
Zstandard 与 gzip、bzip2 和 xz 的比较
当你选择压缩工具时,总是在平衡三个因素:输出文件有多小(压缩率)、压缩速度有多快以及解压缩速度有多快。Zstandard 从一开始就被设计成在所有这三个方面同时超越老牌的 gzip——这听起来好得不像真的,但它在很大程度上确实做到了。 Facebook 自己在标准测试套件 Silesia 语料库上的基准测试显示,zstd 在默认级别(级别 3)下达到了 2.884 倍的压缩率,压缩速度高达 500 MB/s,解压缩速度超过 1,600 MB/s。相比之下,gzip 的默认级别压缩率为 2.743 倍,压缩速度约为 130 MB/s,解压缩速度为 400 MB/s。数字不会说谎:zstd 在压缩和解压缩两方面都更快,并且默认情况下能将文件压得更紧一些。 像 bzip2 这样的其他工具可以实现更好的压缩率(约 3.0 倍),但速度慢如蜗牛,压缩速度通常低于 20 MB/s。尽管 xz 能将压缩率推高到 3.2 倍以上,但其低于 10 MB/s 的压缩速度使其对于任何时间敏感的任务来说都无法使用。 Zstd 的真正强大之处在于它有 22 个压缩级别。级别 1 完全是为了速度,非常适合实时压缩网络流量。另一方面,级别 19-22(“超高”模式)与 xz 的压缩率竞争,同时解压缩速度仍然快一个数量级。大多数人会选择 3-9 范围内的级别。在 Linux 上,你可以轻松控制这一点:`zstd -9 myfile.tar` 会占用更多 CPU 时间,但会生成比默认 `zstd -3 myfile.tar` 更小的文件。
字典训练:大多数人都会跳过的功能
字典压缩是 zstd 最强大但也最常被忽视的功能之一。标准压缩算法通过在单个文件中查找重复模式来工作。但如果文件很小,比如一个 2 KB 的 JSON 数据包怎么办?算法没有足够的数据来建立一个有用的重复模式模型,因此压缩率通常很差。在某些情况下,“压缩后”的文件甚至可能比原始文件更大。 字典训练就是解决方案。你可以向 zstd 提供大量数据样本——比如数千个相似的小日志文件或 JSON 对象——它将生成一个捕获所有这些共同模式的字典文件。然后,压缩器和解压缩器都使用这个共享字典作为起点。Facebook 报告称,通过这项技术,原本几乎无法压缩的小型 JSON 数据块实现了 6 倍的压缩率。 要在命令行上亲自尝试,首先训练一个字典:`zstd --train /path/to/samples/* -o mydict.zst-dict`。然后你用它来压缩文件:`zstd -D mydict.zst-dict smallfile.json`。唯一的缺点是解压缩器也需要完全相同的字典文件。这带来了一个操作上的挑战;你必须将字典与数据一起存储和分发。 那么谁实际会用这个呢?对于数据库工程师、压缩 API 响应的后端开发人员以及任何处理大量结构相似的小文件的用户来说,它都是一个颠覆性的功能。对于只是压缩文件夹的普通用户来说,标准 zstd 已经绰绰有余了。
你在哪里会真正遇到 .zst 文件
你可能已经在不知不觉中使用了 zstd。该算法已远远超出了 Facebook 的服务器,现在已成为现代软件格局的关键组成部分。以下是你会在实际中找到 .zst 文件的几个具体地方: **Linux 包管理器。** Arch Linux 早在 2020 年就从 .tar.xz 切换到了 .tar.zst,理由是软件包安装速度大幅提升。Fedora 随后也效仿。当你运行 `pacman -S` 或 `dnf install` 时,你下载和解压的就是 .zst 压缩文件。 **Linux 内核本身。** 自 5.16 版本以来,内核镜像 (bzImage) 和 initramfs 都可以用 zstd 压缩。一些发行版现在默认提供 zstd 压缩的内核,以显著加快启动时间。 **数据库和存储系统。** Facebook 自己的 RocksDB 原生支持 zstd,流行的分析数据库 ClickHouse 也支持,zstd 是 ClickHouse 推荐的编解码器。PostgreSQL 15 甚至为其逻辑复制消息添加了 zstd 支持。 **大型数据集下载。** 前往 Hugging Face 或其他学术档案库,你会发现许多机器学习数据集现在都以 .zst 或 .tar.zst 文件的形式分发。就连以 .warc.gz 文件闻名的 Common Crawl 数据集,也看到了更多的 .zst 导出。 **游戏资源和软件分发。** Mozilla 使用 zstd 更高效地分发 Firefox 更新,一些游戏引擎在内部使用它,以便在游戏过程中快速流式传输资源。 好消息是,对于大多数这些场景,你不需要做任何特殊的事情。如果你只是需要打开或解压文件,你的系统中的现代工具,如 7-Zip(19.00 及更高版本支持 .zst),都会自动处理。
无需命令行即可打开和转换 .zst 文件
老实说,不是每个人都想生活在终端中或记住压缩标志。如果你收到一个 .zst 文件,并且只需要取出其中的内容,那么根据你的操作系统,你有几个简单的选择。 **Windows:** 7-Zip 是你最好的朋友。它在 22.00 版本(2022 年 7 月发布)中添加了对 zstd 的完整支持。只需右键点击 .zst 文件,导航到“7-Zip > 解压到当前文件夹”,就完成了。如果不起作用,你可能使用的是旧版本;更新它就行了。 **macOS:** 内置的 Archive Utility 尚不能处理 .zst(截至 macOS Sequoia),但出色且免费的 Keka 归档器可以完美做到。或者,如果你使用 Homebrew,在终端中快速运行 `brew install zstd`,然后 `zstd -d file.zst` 也能完成任务。 **Linux:** 你几乎肯定没问题。`zstd` 命令行工具很可能已经安装,或者在你的包管理器中可用。要解压,只需运行 `zstd -d file.zst`。对于 tar 归档文件,`tar --use-compress-program=zstd -xf file.tar.zst` 是经典命令,尽管许多现代系统也支持更简单的 `tar -I zstd -xf file.tar.zst`。 **基于浏览器的转换:** 这正是 CocoConvert 这样的工具大显身手的地方。如果你需要在不安装任何软件的情况下解压 .zst 文件,你可以将其上传到 CocoConvert,并在浏览器中直接提取其内容。这对于大小适中的单流 .zst 文件来说是理想的选择。对于大型的、数千兆字节的 .tar.zst 归档文件或依赖自定义字典的文件,本地工具会更实用。CocoConvert 对此很透明:它旨在出色地处理常见情况,而不是所有可能的极端情况。
创建 .zst 文件:何时适合,何时不适合
当你为特定受众(例如开发人员、系统管理员或已支持它的自动化系统)压缩文件时,Zstandard 是一个绝佳的选择。它非常适合内部归档、分发软件或在另一端优先考虑快速解压缩的数据传输。 但如果你要将文件发送给一个将在普通 Windows 机器上打开它的非技术人员,那么这绝对是错误的选择。对于这项工作,Zip 仍然是王者。每个现代操作系统都能开箱即用地处理 .zip 文件,无需任何疑问,无需额外软件。尽管 zstd 正在普及,但对于随意的文件共享来说,它还没有达到那个程度。坚持使用有效的方法。 然而,对于归档你自己的文件,情况就不同了。使用 zstd 的更高压缩级别(如 -9)是一个绝妙的折衷方案。任何盯着屏幕等待 10 GB 文件夹用 xz 压缩的人都知道那种痛苦——可能需要 8-12 分钟。同样的文件夹,用 `zstd -9` 可能只需 90 秒,生成的文件只稍微大一点点。这种权衡我随时都愿意接受。 要使用 CocoConvert 创建 .zst 文件,你可以上传源文件并选择 .zst 作为输出格式。默认压缩级别几乎适用于所有情况。请记住,CocoConvert 压缩的是单个文件。如果你想将整个文件夹捆绑成一个 .tar.zst 归档文件,你需要先在你的机器上创建 .tar 文件,然后压缩它,或者使用本地命令,例如 `tar -I zstd -cf output.tar.zst folder/`。
坦诚总结:Zstandard 值得学习吗?
让我们明确一点:Zstandard 并非某种可能消逝的小众格式。它已深入嵌入到 Linux 内核中,被主要数据库使用,并被大型 Linux 发行版的包管理器所采用。凭借 Meta 的支持、蓬勃发展的开源社区以及官方 RFC 标准化,它注定会成为软件生态系统中一个稳定、长期的组成部分。 对于开发人员和系统管理员来说,学习使用 zstd 正在成为一项基本技能。理解不同压缩级别之间的权衡,知道何时字典能帮你节省资源,以及掌握 .zst 和 .tar.zst 之间的关系,将在你管理现代基础设施时直接节省你的时间和资源。 对于普通用户来说,要点就简单得多。如果你看到 .zst 文件,你就知道它是什么:一个压缩归档文件。它不是视频也不是奇怪的文档,只是一个容器。而且你知道有简单的方法可以打开它,无论是更新 Windows 上的 7-Zip,为 macOS 获取 Keka,还是使用像 CocoConvert 这样的网络工具。 但 zstd 并非无所不能。它剩下的一个弱点是随意的、人与人之间的文件共享。在 Windows 和 macOS 能够像处理 .zip 文件那样,通过双击直接打开 .zst 文件之前,它仍将是一种需要接收者额外付出一点努力的格式。对于几乎所有其他方面——服务器工作负载、软件分发、数据库压缩和大规模归档——zstd 已经取得了胜利。它是新的合理默认选项,而且理由非常充分。