改版通知

巨人肩膀网站已全新改版。若您仍依赖旧站功能或数据,欢迎联系我们,我们会协助处理。联系我们

一个无损、实时的压缩算法,同时具备高压缩比率和性能,Star 23K!

oP3us6Af1G1D4v7c7iIPkM-piUzQ2024年8月11日334 浏览

我们在日常工作中,或者应用程序中,基本都会用到压缩工具或者算法对文件进行压缩,比如:

•文件传输:对大文件或者很多小文件进行传输时进行压缩,减少传输所需的时间和带宽;

•文件存储:大文件进行存储时,进行文件压缩可以有效的减少存储容量的需求;

•数据备份:对一些备份数据进行压缩存储,比如mysql的dump文件等等;

•多媒体分发:对视频、音频和其他多媒体文件压缩,可以改善用户体验,减少缓冲时间(但是这个也需要实时解压能力)。

•特定系统:比如类似堡垒机、视频监控这类系统,需要存储大量的录屏录像文件,这时候都需要进行压缩存储。

image.png


所以,无论是我们的个人电脑,还是企业服务器,乃至很多应用程序都会安装压缩工具或者模块,而一个好的压缩算法,能够极大的提高应用和系统的数据处理和存储能力。所以今天给大家介绍的是一种高性能无损压缩算法-zstd

01

zstd 介绍

Zstandard简称zstd,是Facebook开源的一种高性能无损压缩算法,专为实时压缩场景设计,提供了比传统zlib算法更高的压缩比率和更快的压缩速度。支持多种压缩级别。此外,它还具备字典压缩功能,特别适合小数据或具有重复模式的数据集,能显著提升压缩效率。

图片


🏠 项目信息

#github地址 https://github.com/facebook/zstd
#项目地址 https://facebook.github.io/zstd/

图片


🚀功能特性

•快速压缩:提供快速的压缩速度,可通过使用参数进一步加速压缩过程。

•高压缩比:提供了比传统压缩算法如zlib和gzip更高的压缩比率。

•多级别压缩:支持选择不同的压缩级别,从快速压缩到最大压缩比率,以满足不同的性能和存储需求。

•字典压缩:支持使用字典来提高小数据或重复的数据的压缩效率。

•流式压缩:支持流式压缩,可以处理连续的数据流,而不需要一次性加载整个文件。

•无损压缩:压缩和解压缩后的数据与原始数据完全一致。

•跨平台支持:支持在多种操作系统和硬件平台上运行,包括Windows、Linux、macOS等。

•多语言绑定:提供了多种编程语言的接口,使得它可以在不同的编程环境中使用。

•可配置的资源使用:可以根据应用的具体需求,调整zstd的内存和CPU使用策略。

•错误处理:提供了错误检测和处理机制,确保数据的完整性和可靠性。

•命令行工具:提供了命令行工具,方便直接在终端中进行压缩和解压缩。

•文件格式:虽然zstd的文件格式是.zst,是一个独立的格式,但是也可以兼容其他格式如.gz、.xz和.lz4。

•投产状态: zstd已在Facebook和其他大型云基础设施中部署,被认为适合生产环境。

🛠 和多种压缩算法的数据对比

项目提供了和其他压缩算法的对比作为参考。在配备 Core i7-9700K CPU @ 4.9GHz , Ubuntu 20.04操作系统上进行测试比较了几种常见的压缩算法。


压缩算法和版本压缩比率压缩速度解压速度
zstd 1.5.6 -12.887510 MB/s1580 MB/s
zlib 1.2.11 -12.74395 MB/s400 MB/s
brotli 1.0.9 -02.702395 MB/s430 MB/s
zstd 1.5.6 --fast=12.437545 MB/s1890 MB/s
zstd 1.5.6 --fast=32.239650 MB/s2000 MB/s
quicklz 1.5.0 -12.238525 MB/s750 MB/s
lzo1x 2.10 -12.106650 MB/s825 MB/s
lz4 1.9.42.101700 MB/s4000 MB/s
lzf 3.6 -12.077420 MB/s830 MB/s
snappy 1.1.92.073530 MB/s1660 MB/s

在同样的基准下,测试zstd和zlib、lzma 详细的对比图:

图片


压缩的数据量越小,压缩就越困难。为了解决这种情况,Zstd 提供了一种训练模式,可用于针对所选类型的数据调整算法。训练 Zstandard 是通过为其提供一些样本(每个样本一个文件)来实现的。此训练的结果存储在名为“字典”的文件中,必须在压缩和解压缩之前加载该文件。使用此字典,可以显著提高小数据上可实现的压缩率。下图为采用“字典”进行压缩解压和不采用“字典”的对比:

图片


02

zstd 安装

zstd目前已经可以通过操作系统的包管理器进行安装,以Ubuntu操作系统为例:

#更新系统
sudo apt update
sudo apt upgrade
#安装依赖
sudo apt install build-essential wget tar
#安装zstd
sudo apt install zstd

03

zstd 使用

•命令行:

zstd的命令行基础使用比较简单:

#压缩文件
zstd filename
#调整压缩级别,其中“#”是1到19之间的数字
zstd -# filename
#解压缩
zstd -d filename.zst

文件压缩时会有前后对比说明:

图片


•图形化:

zstd作为一种压缩算法,可以被现有的压缩工具使用,比如7-zip或者,WinRAR:

#支持zstd的7-zip下载
https://github.com/mcmilk/7-Zip-zstd/releases
#支持zstd的WinRAR下载

图片

•多种编程语言:

虽然zstd采用的为C语言,但是很多项目作者提供了其他语言支持详见以下链接:

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

图片

比如在Python 3 中使用:

# Module has simple API:
>>> import zstd
>>> dir(zstd)['Error', 'ZSTD_compress', 'ZSTD_external', 'ZSTD_uncompress', 'ZSTD_version', 'ZSTD_version_number', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'compress', 'decompress', 'dumps', 'loads', 'uncompress', 'version']>>> zstd.version()
'1.5.1.0'
>>> zstd.ZSTD_version()
'1.5.1'
>>> zstd.ZSTD_version_number()
10501
>>> zstd.ZSTD_external()
0
# In python3 use bytes
>>> data = b"123456qwert"
>>> cdata = zstd.compress(data, 1)
>>> data == zstd.decompress(cdata)
True
>>> cdata_mt = zstd.compress(data, 1, 4)
>>> cdata == cdata_mt
True
>>> data == zstd.decompress(cdata_mt)
True

04

最后

综上所述,zstd是一种高效、灵活的压缩工具,适用于需要快速压缩和解压缩的场景,如网络数据传输、实时视频流处理、大规模数据存储、多媒体内容分发、以及日常文件备份和恢复,能够显著减少数据传输时间和存储空间,同时保持数据的完整性和一致性。如果你也在寻找类似的压缩解压方案的话,不防试试zstd吧!