Zstd-数据压缩组件
Zstandard 简称Zstd,是一款快速实时的开源数据压缩程序,由Facebook开发,源码是用C语言编写的。相比业内其他压缩算法(如Gzip、Snappy、Zlib)它的特点是:当需要时,它可以将压缩速度交换为更高的压缩比率(压缩速度与压缩比率的权衡可以通过小增量来配置),反之亦
Zstd-jni
Zstd拥有丰富的API,几乎支持所有流行的编程语言,Zstd-jni 是Java中提供的API然。 它具有小数据压缩的特殊模式,称为字典压缩,可以从任何提供的样本集中构建字典。
<dependency>
<groupId>com.github.luben</groupId>
<artifactId>zstd-jni</artifactId>
<version>VERSION</version>
</dependency>
- /*
- 序列化
- */
- public static <T> byte[] serialize(T result) throws IOException {
- ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(512);
- try (OutputStream outputStream = new ZstdOutputStream(byteArrayOutputStream)) {
- // protostuff serialize
- ProtostuffSerializer.serialize(result, outputStream);
- return byteArrayOutputStream.toByteArray();
- }
- }
- /*
- 反序列化
- */
- public static <T> T deserialize(byte[] bytes, Class<T> clazz) throws IOException {
- ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
- try (InputStream inputStream = new ZstdInputStream(byteArrayInputStream)) {
- // protostuff deserialize
- return ProtostuffSerializer.deserialize(clazz, inputStream);
- }
- }
- ZstdDictTrainer zstdDictTrainer = new ZstdDictTrainer(1024 * 1024, 32 * 1024);
- // fileInput is a sample file
- zstdDictTrainer.addSample(fileInput);
- byte[] dic = zstdDictTrainer.trainSamples(true);
- /*
- Zstd's training model
- */
- public static <T> byte[] serialize(T result) throws IOException {
- ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(512);
- try (ZstdOutputStream outputStream = new ZstdOutputStream(byteArrayOutputStream)) {
- if (dic != null) {
- outputStream.setDict(dic);
- }
- // protostuff serialize
- ProtostuffSerializer.serialize(result, outputStream);
- return byteArrayOutputStream.toByteArray();
- }
- }
- /*
- Zstd's training model
- */
- public static <T> T deserialize(byte[] bytes, Class<T> clazz) throws IOException {
- ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
- try (ZstdInputStream inputStream = new ZstdInputStream(byteArrayInputStream)) {
- if (dic != null) {
- inputStream.setDict(dic);
- }
- // protostuff deserialize
- return ProtostuffSerializer.deserialize(clazz, inputStream);
- }
- }
服务器:VM/4CPU i5-6500/CentOS 6
exp1: 4KB
|
version |
compress |
decompress |
Ratio |
|
|---|---|---|---|---|
| Gzip | jdk1.8 | 0.162ms | 0.059ms | 2.31 |
| Snappy | 1.1.7.2 | 0.005ms | 0.002ms | 1.83 |
| Zstd | 1.3.7-3 | 0.033ms | 0.012ms | 2.27 |
| Zstd_Dic | 1.3.7-3 | 0.020ms | 0.029ms | 3.81 |
exp2: 16KB
|
version |
compress |
decompress |
Ratio |
|
|---|---|---|---|---|
| Gzip | jdk1.8 | 0.279ms | 0.126ms | 4.29 |
| Snappy | 1.1.7.2 | 0.022ms | 0.007ms | 3.18 |
| Zstd | 1.3.7-3 | 0.049ms | 0.002ms | 4.39 |
| Zstd_Dic | 1.3.7-3 | 0.062ms | 0.017ms | 5.70 |
exp3: 43KB
|
version |
compress |
decompress |
Ratio |
|
|---|---|---|---|---|
| Gzip | jdk1.8 | 0.767ms | 0.339ms | 6.49 |
| Snappy | 1.1.7.2 | 0.111ms | 0.044ms | 4.36 |
| Zstd | 1.3.7-3 | 0.257ms | 0.018ms | 6.67 |
| Zstd_Dic | 1.3.7-3 | 0.199ms | 0.061ms | 8.12 |
exp4: 134KB
|
version |
compress |
decompress |
Ratio |
|
|---|---|---|---|---|
| Gzip | jdk1.8 | 1.786ms | 1.026ms | 13.34 |
| Snappy | 1.1.7.2 | 0.894ms | 0.595ms | 6.53 |
| Zstd | 1.3.7-3 | 0.411ms | 0.198ms | 14.74 |
| Zstd_Dic | 1.3.7-3 | 0.220ms | 0.089ms | 16.48 |
exp5: 654KB
|
version |
compress |
decompress |
Ratio |
|
|---|---|---|---|---|
| Gzip | jdk1.8 | 4.587ms | 1.865ms | 33.64 |
| Snappy | 1.1.7.2 | 2.069ms | 1.430ms | 8.86 |
| Zstd | 1.3.7-3 | 2.864ms | 0.116ms | 45.57 |
| Zstd_Dic | 1.3.7-3 | 0.426ms | 0.218ms | 47.38 |
引用链接:
https://github.com/facebook/zstd
https://github.com/luben/zstd-jni
Zstd-数据压缩组件的更多相关文章
- 【转载】.NET压缩/解压文件/夹组件
转自:http://www.cnblogs.com/asxinyu/archive/2013/03/05/2943696.html 阅读目录 1.前言 2.关于压缩格式和算法的基础 3.几种常见的.N ...
- C# 压缩组件介绍与入门
1.前言 作为吉日嘎拉权限管理系统最早的一批学习版用户,学了不少东西,在群里面也结识了很多朋友,更重要的是闲余时间,大家都发布很多可靠的外包工作.这次也是由于吉日嘎拉发布了一个有关“压缩文件损坏检测” ...
- C#编程总结(十三)数据压缩
C#编程总结(十三)数据压缩 在进行文件存储或者数据传输时,为了节省空间流量,需要对数据或文件进行压缩.在这里我们讲述通过C#实现数据压缩. 一.GZipStream压缩 微软提供用于压缩和解压缩流的 ...
- Web前端性能优化教程04:压缩组件
本文是Web前端性能优化系列文章中的第四篇,主要讲述内容:压缩组件.完整教程可查看:Web前端性能优化 基础知识 gzip编码:gzip是GUNzip的缩写,是使用无损压缩算法的一种,最早是用于Uni ...
- 支付宝 Android 版使用的开源组件
支付宝 Android 版使用的开源组件 前言: 花了点时间整理了 支付宝 Android 客户端使用的开源组件,给需要的同学.在你不知道用什么开源框架的时候可以作下参考,毕竟支付宝是阿里的重量级产品 ...
- zstd --压缩工具
Zstandard (也被称为zstd )是一款免费的开源,快速实时数据压缩程序,具有更好的压缩比 (约为 10:1). 安装 yum group install "Development ...
- openstack项目【day23】:keystone组件HTTP协议
阅读目录 一 为何要学习HTTP协议 二 用户上网过程 三 HTTP协议 part1 http协议概述 part2 请求协议 part3 响应协议 四 抓包分析HTTP协议 一 为何要学习HTTP协议 ...
- HBase 架构与工作原理2 - HBase 组件
本文系转载,如有侵权,请联系我:likui0913@gmail.com 一.HBase 组件概览 Master-Slave 模式: HBase 体系结构遵循传统的 master-slave 模式,由一 ...
- Hadoop Hive概念学习系列之hive的数据压缩(七)
Hive文件存储格式包括以下几类: 1.TEXTFILE 2.SEQUENCEFILE 3.RCFILE 4.ORCFILE 其中TEXTFILE为默认格式,建表时不指定默认为这个格式,导入数据时会直 ...
- RT_THREAD之组件学习
CmBacktrace (Cortex Microcontroller Backtrace)是一款针对 ARM Cortex-M 系列 MCU 的错误代码自动追踪.定位,错误原因自动分析的开源库.支持 ...
随机推荐
- nextjs 类装饰器
// 类装饰器 == 本质就是一个函数 // 在某个类的上面使用 @ // 可以等价于函数调用 doc(Zlx) // 不会破坏原有的类 可以扩展类 // "experimentalDeco ...
- .NET云原生应用实践(二):Sticker微服务RESTful API的实现
本章目标 完成数据访问层的基本设计 实现Sticker微服务的RESTful API 引言:应该使用ORM框架吗? 毋庸置疑,Sticker微服务需要访问数据库来管理"贴纸"(也就 ...
- 使用Pydantic和SqlAlchemy实现树形列表数据(自引用表关系)的处理,以及递归方式处理数据差异
在我的设计框架业务中,字典大类.部门机构.系统菜单等这些表,都存在id.pid的字段,主要是作为自引用关系,实现树形列表数据的处理的,因为这样可以实现无限层级的树形列表.在实际使用Pydantic和S ...
- WinSCP 脚本实现将 jar 包一键上传 Ubuntu 并 docker 部署
准备 首先,在 Ubuntu 写一个.sh 脚本用于自动更新 jar 包的 docker 容器和镜像,然后在 Windows 写一个.bat 脚本用于上传 jar 包并运行.sh 脚本. deploy ...
- 怎么使用云桌面(云电脑)?ToDesk新手入门教程
在当今数字化时代,个人用户对于电脑性能的需求日益提升,而云电脑(又可称为云桌面)作为一种新型的电脑配备模式,正在逐渐进入人们的视野. 对于很多新手来说,可能是第一次接触到云电脑软件,今天小社长就以To ...
- JavaScript对象获取属性的方法(.和[]方式)
js对象获取属性有两种方法:1.通过.的方式 2. 通过[]方式 // 通过.方式获取属性值,key是静态的 var aa = {name: "zhang", age: 18}; ...
- 线性枚举(C语言)
1.求最大值 比如求一个线性表中的最大值,可以先设定一个最大值,把它初始化为一个非常小的数,然后遍历给定的线性表,将其中的每个元素和目前的最大值比较,如果比它大,则更新这个最大值: 如果比它小,就不做 ...
- js实现浏览器后退页面刷新
最近在开发中遇到一个问题: 在一个列表页面,点击进入详情,详情页面对其状态操作,其详情页面有做修改,然后点击浏览器后退,返回到列表页,在列表页面状态还是操作之前的,为解决状态统一需要手动刷新改列表页. ...
- html换行的方法
1.使用<br> 1 <html> 2 <body> 3 <p> 4 春眠不觉晓,<br />处处闻啼鸟.<br />夜来风雨声 ...
- ClickHouse-查询优化
单表查询[使用的频率高] 1.prewhere代表where Prewhere 和 where 语句的作用相同,用来过滤数据.不同之处在于 prewhere 只支持*MergeTree 族系列引擎的表 ...