学到了,原来 gzip 是种`连续分块`的压缩算法
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!
我想要表述的是:假设有 10 mb的数据使用 gzip 算法来压缩。
有这样可能的做法:
- 分配 10mb 的缓冲区,一次压缩 10mb
- 分配 1mb 的缓冲区,每次压缩 1mb,分为十次压缩
如果压缩后的数据有统一的头部信息,那么压缩后的数据必须统一存放,每一次后续的压缩都需要去修改这个头部。
反之,如果每次压缩都是独立的块,那么前一次压缩与后一次压缩就是完全不关联的。在实际应用中,就可以做流式处理。
经过实验发现,gzip 压缩后的数据块格式,就像我上面说的第二种,是连续分块的。
下面是我的实验代码:
// 两个函数所产生的文件内容完全一样
func testWriteFile() {
f, _ := os.Create("part_test.txt.gz")
_, _ = f.Write(fasthttp.AppendGzipBytesLevel(nil, []byte(`0123456789`), fasthttp.CompressBestSpeed))
_, _ = f.Write(fasthttp.AppendGzipBytesLevel(nil, []byte(`abcdefghijk`), fasthttp.CompressBestSpeed))
_, _ = f.Write(fasthttp.AppendGzipBytesLevel(nil, []byte(html), fasthttp.CompressBestSpeed))
_, _ = f.Write(fasthttp.AppendGzipBytesLevel(nil, []byte(js), fasthttp.CompressBestSpeed))
f.Close()
}
func testWriteFile1() {
f, _ := os.Create("part_test1.txt.gz")
buf := fasthttp.AppendGzipBytesLevel(nil, []byte(`0123456789`), fasthttp.CompressBestSpeed)
buf = fasthttp.AppendGzipBytesLevel(buf, []byte(`abcdefghijk`), fasthttp.CompressBestSpeed)
buf = fasthttp.AppendGzipBytesLevel(buf, []byte(html), fasthttp.CompressBestSpeed)
buf = fasthttp.AppendGzipBytesLevel(buf, []byte(js), fasthttp.CompressBestSpeed)
_, _ = f.Write(buf)
f.Close()
}
这样的好处是:在一个 http 服务器中,页面输出的过程中,部分输出内容可以提前压缩好,这样就能够节约整体的压缩带来的 cpu 消耗。
学到了,原来 gzip 是种`连续分块`的压缩算法的更多相关文章
- 剑指offer41:所有和为S的连续正数序列,例如,有多少种连续的正数序列的和为100
1 题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久 ...
- 数据可视化之powerBI入门(三)财务人员必学,使用Powerquery是一种什么体验?
https://zhuanlan.zhihu.com/p/54700574 财务人员必学,使用Powerquery是一种什么体验? 你和Excel高手的距离只差了一个Power Query!!! 先思 ...
- 从零开始学安全(五)●Vmware虚拟机三种网络模式详解
vmware为我们提供了三种网络工作模式,它们分别是:Bridged(桥接模式).NAT(网络地址转换模式).Host-Only(仅主机模式). NAT(网络地址转换模式) NAT(网络地址转换)vm ...
- 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
// test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- 【素数】 poj 2739 一个数能有多少种连续素数相加方案
简单题 素数打表 根据数据量 用n2算法遍历 开一个save[k]素数存前k个素数和即可. #include <iostream> #include <cstdio> ...
- JavaScript筛选出数组种连续的数字
function arrange(source) { var t; var ta; var r = []; for(var j=0;j<source.length;j++){ var v=sou ...
- Java实现单向链表基本功能
一.前言 最近在回顾数据结构与算法,有部分的算法题用到了栈的思想,说起栈又不得不说链表了.数组和链表都是线性存储结构的基础,栈和队列都是线性存储结构的应用- 本文主要讲解单链表的基础知识点,做一个简单 ...
- cdoj1344卿学姐种美丽的花
地址:http://acm.uestc.edu.cn/#/problem/show/1344 题目: 卿学姐种美丽的花 Time Limit: 8000/4000MS (Java/Others) ...
- 【剑指Offer】和为S的连续正数序列 解题报告(Python)
[剑指Offer]和为S的连续正数序列 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interview ...
- HBase中的压缩算法比较 GZIP、LZO、Zippy、Snappy [转]
网址: http://www.cnblogs.com/panfeng412/archive/2012/12/24/applications-scenario-summary-of-compressio ...
随机推荐
- 详解CNN实现中文文本分类过程
摘要:本文主要讲解CNN实现中文文本分类的过程,并与贝叶斯.决策树.逻辑回归.随机森林.KNN.SVM等分类算法进行对比. 本文分享自华为云社区<[Python人工智能] 二十一.Word2Ve ...
- 看火山引擎DataLeap如何做好电商治理(一):挑战与痛点
现在人们的日常生活中,网购已经成为人们生活中不可或缺的购物形式.根据中国电子商会发布的<中国社交电商行业发展白皮书(2022)>的数据显示,2022年社交电商市场交易规模达到28542.8 ...
- Solon2 接口开发: 实战 Gateway 模式效果
1.效果预览 网关 @Mapping("/api/v3/app/**") @Component public class ApiGateway3x extends UapiGate ...
- Python 合并多张图片至一张图片
PDF 有多页,一次性转成JPG 图片,JAVA 报内存溢出, 现改为,每一页存成一张图片,然后再将多张图片合成一张图片. 安装库 pip3 install Image -i https://pypi ...
- 未来,让我们一起想象 — “Imagine” 阿里云视频云全景创新峰会
视频云赛道是一条极具想象力的赛道,可以变革商业与社会,成为大视频时代底座. 视频云技术是一项极具创新力的技术,可以突破时间与空间,创造一个全新的世界. 7 月 10 日,"Imagine&q ...
- HashMap非线程安全到底有什么问题
HashMap是Java中常用的数据结构,用于存储键值对,并且提供了快速的查找和插入操作.下面挖掘一下HashMap内部的架构设计思维: 哈希函数的设计: HashMap使用哈希函数将键映射到数组索引 ...
- vue+spingboot 实现服务器端文件下载功能
vue3 和springboot配合如何实现服务器端文件的下载. 先看springboot的后台代码: @PostMapping("/download") @ResponseBod ...
- vue 状态管理 一、状态管理概念和基本结构
系列导航 vue 状态管理 一.状态管理概念和基本结构 vue 状态管理 二.状态管理的基本使用 vue 状态管理 三.Mutations和Getters用法 vue 状态管理 四.Action用法 ...
- S3C2440移植uboot之裁剪和修改默认参数
上一节S3C2440移植uboot之支持DM9000移植uboot支持了网卡驱动,这节裁剪和修改uboot默认参数 目录 uboot的环境参数 修改uboot的默认环境变量 查看 default_ ...
- Gradle 出现 Could not resolve gradle
Gradle 在进行 sync 的时候会出现 Caused by: org.gradle.internal.resolve.ModuleVersionResolveException: Could n ...
