首页 > 编程语言 >学到了,原来 gzip 是种`连续分块`的压缩算法

学到了,原来 gzip 是种`连续分块`的压缩算法

时间:2023-10-09 16:13:29浏览次数:47  
标签:AppendGzipBytesLevel 分块 buf 压缩 gzip fasthttp 压缩算法 byte CompressBestSpeed

作者:张富春(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 消耗。

标签:AppendGzipBytesLevel,分块,buf,压缩,gzip,fasthttp,压缩算法,byte,CompressBestSpeed
From: https://www.cnblogs.com/ahfuzhang/p/17751999.html

相关文章

  • gzip命令 – 压缩和解压文件
    gzip命令来自于英文单词gunzip的缩写,其功能是用于压缩和解压文件。gzip是一款使用广泛的压缩工具,文件经过压缩后一般会以.gz后缀结尾,与tar命令合用后即为.tar.gz后缀。据统计,gzip命令对文本文件的压缩比率通常能达到60%~70%,压缩后可以很好的提升存储空间的使用率,还能够在网络传输......
  • 【整除分块】【DP】ABC239Ex Dice Product 2 题解
    ABC239H简单题。令\(f_i\)表示乘到\(\gei\)的期望。容易得到\(f_i=\dfrac{\sum\limits_{j=1}^{n}f_{\lceil\frac{i}{j}\rceil}}{n}\)。将\(f_i\)移到同一边,去掉系数,有\(f_i=\dfrac{n\sum\limits_{j=2}^{n}f_{\lceil\frac{i}{j}\rceil}}{n-1}\)。提出\(\frac{n-1}{n......
  • 【ACM算法】整数分块
    思考如何计算以下算式:\[\sum_{i=1}^{n}\lfloor\frac{n}{i}\rfloor\qquad(n\le10^6)\]所有人都会觉得这个非常简单,一个for循环可以直接解决,时间复杂度\(O(n)\),但是如果将\(n\)的范围改大一点点,改成\(n\leq10^{12}\)呢?这时如果我们用朴素算法一定会T;但是我们可以手......
  • 分块+ST的RMQ
    期望\(O(n)-O(1)的RMQ\)#include<bits/stdc++.h>#defineintlonglong#defineF(i0,i1,i2)for(inti0=(i1);i0<=(i2);++i0)usingnamespacestd;inlineintrd(){ intx=0,f=0;charch=getchar(); while(!isdigit(ch)){if(ch=='-')f=1;ch=getchar(......
  • [Резюме] 基础数列分块
    Preface分块可以\(O(n\sqrt{n})\)解决不能用线段树解决的问题,即不能快速合并区间信息的问题,是很多高级算法与数据结构的基础。本篇只是作者基础入门的一些感受,例题为\(\text{LOJ}[6277,6285]\),下一步计划学习莫队算法,这里有学习总结。Content0如何分块?考虑将标准块大小定......
  • 压缩算法介绍
    压缩算法是一种将文件或数据进行压缩的技术。它可以减小文件的大小,从而节省存储空间,并提高传输效率。以下是一些常见的压缩算法:无损压缩算法:这类算法通过消除文件中的冗余信息来减小文件的大小,同时保留了文件的完整性,即可还原为原始文件。其中,哈夫曼编码和LZ77算法(如DEFLATE)是非常......
  • json数据传输压缩以及数据切片分割分块传输多种实现方法,大数据量情况下zlib压缩以及by
    json数据传输压缩以及数据切片分割分块传输多种实现方法,大数据量情况下zlib压缩以及bytes指定长度分割。importsysimportzlibimportjsonimportmathKAFKA_MAX_SIZE=1024*1024CONTENT_MIN_MAX_SIZE=KAFKA_MAX_SIZE*0.9defsplit_data(data):""":param......
  • LZW字典压缩算法及例程
    字典压缩算法是一种数据压缩方法,其基本原理是将重复出现的字符串或者片段用一个短的代表符号来表示,从而减小数据的存储空间。字典压缩算法通常用于无损压缩数据。一种常见的字典压缩算法是Lempel-Ziv-Welch(LZW)算法。该算法通过构建和更新一个字典来实现压缩。初始时,字典中包含......
  • Kafka消息压缩算法性能调优与选择
    前言Kafka作为一款高性能的分布式消息队列,其消息压缩算法的选择和调优对于系统性能的提升至关重要。本文将深入探讨Kafka消息压缩算法的性能调优和选择。压缩算法的选择Kafka支持多种压缩算法,包括gzip、snappy和lz4。这些算法各有优缺点,需要根据实际情况进行选择。gzipgzip是......
  • nginx指定文件类型进行gzip压缩
    如果在访问Nginx服务器时看到了.gz压缩文件,但其中也包括了不是JavaScript文件的内容,这可能是由于Nginx配置未正确过滤或限制哪些文件应该进行gzip压缩所致。在Nginx配置中,你可以使用gzip_types指令来指定哪些文件类型应该进行gzip压缩。以下是一些步骤来确保只有JavaScript文件......