Zstandard (zstd)压缩算法在JAVA上的使用

简介: Zstandard (zstd)压缩算法在JAVA上的使用

Zstandard 是facebook厂商提供的一种高压缩率的实时压缩算法,他在压缩比和压缩速度上做了很好的平衡,同时还提供高速的解码器,针对小数据,也提供了一种叫做字典压缩算法,从样本中可以创建出字典集合数据,Zstandard库以BSD协议方式开源。

该算法是由Facebook的Yann Collet开发的一个无损数据压缩算法。Zstandard在设计上与DEFLATE(.zip、gzip)算法有着差不多的压缩比,但有更高的压缩和解压缩速度。

Zstandard使用字典算法(LZ77)结合熵编码法的有限状态熵(tANS)。—–Wikipedia

以下是基准测试数据对比:

默认Zstandard压缩的level=3,极限:Zstd Level22

压缩算法 压缩比 压缩速度 解压缩速度
zstd 1.4.5 -1 2.884 500 MB/s 1660 MB/s
zlib 1.2.11 -1 2.743 90 MB/s 400 MB/s
brotli 1.0.7 -0 2.703 400 MB/s 450 MB/s
zstd 1.4.5 --fast=1 2.434 570 MB/s 2200 MB/s
zstd 1.4.5 --fast=3 2.312 640 MB/s 2300 MB/s
quicklz 1.5.0 -1 2.238 560 MB/s 710 MB/s
zstd 1.4.5 --fast=5 2.178 700 MB/s 2420 MB/s
lzo1x 2.10 -1 2.106 690 MB/s 820 MB/s
lz4 1.9.2 2.101 740 MB/s 4530 MB/s
lzf 3.6 -1 2.077 410 MB/s 860 MB/s
snappy 1.1.8 2.073 560 MB/s 1790 MB/s

github java库,GitHub - luben/zstd-jni: JNI binding for Zstd

如何引入库:

implementation group: 'com.github.luben', name: 'zstd-jni', version: '1.+';

如何使用:

压缩:

byte[] array=...;
byte[] compressArray = Zstd.compress(array);

解压缩:

byte[] compressArray=...
int size = (int) Zstd.decompressedSize(compressArray);
byte[] array = new byte[size];
Zstd.decompress(array, compressArray);

一般建议在长度大于256后,才开启压缩。

笔者把zstandard 和zlib做了基准测试,经过测试,发现和预期还是有差距, 我建议,该算法不是很有必要替换现有的用于协议之间传输的zlib压缩算法(或许它的字典算法能改善这个测试数据,或者是我的测试量太少了?),因为对于小数据来说,改善不明显,反而还有降低的可能,但是,强烈建议用于数据库(redis或者mysql)的海量数据的存储压缩解压,比如地图点数据,性能具有大幅提升。

sample ratio compress speed(ms) decompress  speed(ms)
algorithm zlib zstandard zlib zstandard zlib zstandard
17000中文字 2.005 1.845 0.873 0.1957 0.154 0.0402
1000英文 2.014 1.906 0.0319 0.0191 0.0117 0.0091
437英文 2.253 2.163 0.0237 0.0167 0.0069 0.0082
256 英文 1.673 1.61 0.0199 0.0141 0.007 0.0091
128 英文 1.293 1.243 0.0115 0.0102 0.0018 0.0068

以下是官方的图,可以做下对比:下图表示,zstandard比zlib,同样的压缩比情况下,速度高于zlib,同样的速度情况下,压缩比要高于zlib

参考:zstandard: Zstandard(zstd)是 Facebook 开源的一种快速无损压缩算法,以 zlib 级为目标的实时压缩场景和更好的压缩比

目录
相关文章
|
19天前
|
前端开发 Java
Java压缩20M文件非常厉害
Java压缩20M文件非常厉害
30 1
|
19天前
|
存储 人工智能 算法
【数据结构-算法】:数据结构和算法的一些个人总结(Java实现)
【数据结构-算法】:数据结构和算法的一些个人总结(Java实现)
65 0
|
19天前
|
算法 Java
Java使用Cipher.getInstance(“AES/ECB/PKCS5Padding“);加解密算法工具类实现
Java使用Cipher.getInstance(“AES/ECB/PKCS5Padding“);加解密算法工具类实现
69 0
|
7天前
|
算法 安全 Java
Java多线程基础-12:详解CAS算法
CAS(Compare and Swap)算法是一种无锁同步原语,用于在多线程环境中更新内存位置的值。
16 0
|
19天前
|
算法 安全 Java
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
【4月更文挑战第28天】性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
43 1
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
|
13天前
|
存储 编解码 算法
图像的压缩算法--尺寸压缩、格式压缩和品质压缩
图像的压缩算法--尺寸压缩、格式压缩和品质压缩
26 0
|
13天前
|
算法 Java
Java中CAS算法的集中体现:Atomic原子类库,你了解吗?
【5月更文挑战第15天】Java中CAS算法的集中体现:Atomic原子类库,你了解吗?
29 1
|
16天前
|
算法 搜索推荐 Java
滚雪球学Java(33):数组算法大揭秘:应用案例实战分享
【5月更文挑战第8天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
43 8
滚雪球学Java(33):数组算法大揭秘:应用案例实战分享
|
17天前
|
缓存 算法 Java
数据结构~缓存淘汰算法--LRU算法(Java的俩种实现方式,万字解析
数据结构~缓存淘汰算法--LRU算法(Java的俩种实现方式,万字解析
|
17天前
|
NoSQL 算法 Java
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
【redis源码学习】持久化机制,java程序员面试算法宝典pdf