当前位置: 首页 > news >正文

Golang高效合并(拼接)多个gzip压缩文件

有时我们可能会遇到需要把多个 gzip 文件合并成单个 gzip 文件的场景,最简单最容易的方式是把每个gzip文件都先解压,然后合并成一个文件后再次进行压缩,最终得到我们想要的结果,但这种先解压后压缩的方式显然效率不高,有没有更好的实现方式呢,答案是肯定的,Linux下常用的压缩库 Zlib 的两位主要作者之一 Mark Adler 就给我们提供了一个这样的示例程序:

https://github.com/madler/zlib/blob/develop/examples/gzjoin.c

在这里插入图片描述
从说明中我们可以看出,这种方式只需要解压一遍所有文件(用于找到特定的比特位并修改它),但不需要做任何额外的压缩操作,而且合并后的 gzip 文件末尾的 crc32 校验和也不需要从头计算(根据源 gzip 文件的校验和用函数 crc32_combine 便可计算出),一般来说,解压操作比压缩速度更快,所以这种合并 gzip 文件的方式性能相当高效,如果是在 C 语言中实现,我们就可以直接借鉴 Mark Adler 大佬的代码。

Go 语言实现

用 Go 内置的 compress/gzip 或者 compress/flate 包无法实现与 gzjoin.c 相同的功能,因为 gzjoin.c 的实现依赖解压时的 Z_BLOCK 刷写模式,而 compress/flate 解压缩时并不支持指定 Flush 模式,所以我们只能换一种思路,利用 cgo 来直接调用 Zlib C 库,具体实现可以参考我这里的代码 https://github.com/zhyee/deflatejoin,如果对实现细节不感兴趣,也可以在你的Go项目中直接调用该module,相比用 解压 --> 合并文件 --> 再压缩 的方式速度有极大提升!

goos: darwin
goarch: arm64
pkg: github.com/zhyee/deflatejoin
BenchmarkConcatGzip/concat-standard-go-8                       9         123559972 ns/op         1257826 B/op       1261 allocs/op
BenchmarkConcatGzip/concat-deflatejoin-8                     100          10784015 ns/op           30289 B/op         41 allocs/op

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MongoDB教程(二十一):MongoDB大文件存储GridFS
  • 安全产品在防御勒索病毒中的作用
  • windows使用ssh-agent管理私钥
  • 23.jdk源码阅读之Thread(下)
  • Scala学习笔记20: Future 和Promise
  • 【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第三十八章 驱动模块编译进内核
  • 【BUG】已解决:The above exception was the direct cause of the following exception:
  • C#知识|账号管理系统:修改登录密码界面的UI设计
  • 一下午连续故障两次,谁把我们接口堵死了?!
  • 【通信模块】LoraWAN网络简介
  • 打造一篇完美的【数学建模竞赛论文】:从准备到撰写的全面指南
  • 免费通配符/泛域名SSL证书快速申请攻略
  • 3.qml与c++模块化开发
  • LeetCode 637, 67, 399
  • go-kratos 学习笔记(7) 服务发现服务间通信grpc调用
  • [数据结构]链表的实现在PHP中
  • [译] 怎样写一个基础的编译器
  • 【RocksDB】TransactionDB源码分析
  • Android 控件背景颜色处理
  • download使用浅析
  • es6--symbol
  • ES6--对象的扩展
  • JavaScript设计模式系列一:工厂模式
  • js写一个简单的选项卡
  • passportjs 源码分析
  • Redis在Web项目中的应用与实践
  • Redis中的lru算法实现
  • session共享问题解决方案
  • TypeScript实现数据结构(一)栈,队列,链表
  • vue中实现单选
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 第2章 网络文档
  • 关于extract.autodesk.io的一些说明
  • 离散点最小(凸)包围边界查找
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 因为阿里,他们成了“杭漂”
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 如何用纯 CSS 创作一个货车 loader
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #QT(智能家居界面-界面切换)
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (003)SlickEdit Unity的补全
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (javaweb)Http协议
  • (PADS学习)第二章:原理图绘制 第一部分
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (二)丶RabbitMQ的六大核心
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (五)MySQL的备份及恢复
  • .ai域名是什么后缀?