Algoritmo de compresión: tome golang/snappy como ejemplo


Compresión, típico tiempo por espacio.

Cuando se usa LRU, hashicorp/golang-lru es la primera opción, pero no sé cuándo, el funcionario de Go construyó silenciosamente un caché de grupo y también proporcionó la implementación de lru...

Eché un vistazo rápido y descubrí que, además de ir a github.com/golang, también hay un conjunto completo de componentes de uso común. Por ejemplo, el complemento vscode/sublime incluye la herramienta de prueba de rendimiento perf, la biblioteca de manejo de errores xerrors, la biblioteca de registros glog y simulacros para pruebas individuales... Incluso la compresión se proporciona con snappy y la base de datos esleveldb. . . Esto es simplemente un intento de "poner en marcha" toda la cadena industrial.


golang/rápido [1]


snappy es un algoritmo de compresión desarrollado por Google, que tiene la ventaja de una velocidad muy alta y una tasa de compresión razonable (la tasa de compresión es menor que gzip).


package main

import (
 "fmt"
 "github.com/golang/snappy"
 "io/ioutil"
)

var (
 textMap = map[string]string{
  "a"`1234567890-=qwertyuiop[]\';lkjhgfdsazxcvbnm,./`,

  // a重复4次
  "b"`1234567890-=qwertyuiop[]\';lkjhgfdsazxcvbnm,./1234567890-=qwertyuiop[]\';lkjhgfdsazxcvbnm,./1234567890-=qwertyuiop[]\';lkjhgfdsazxcvbnm,./1234567890-=qwertyuiop[]\';lkjhgfdsazxcvbnm,./`,

  "c"`浕浉浄浀浂洉洡洣浐洘泚浌洼洽派洿浃浇浈浊测浍济浏浑浒浓浔泿洱涏洀洁洂洃洄洅洆洇洈洊洋洌洎洏洐洑洒洓洔洕洗洠洙洚洛洝洞洟洢洤津洦洧洨洩洪洫洬洭洮洲洳洴洵洶洷洸洹洺活涎`,

  // c重复3次
  "d"`浕浉浄浀浂洉洡洣浐洘泚浌洼洽派洿浃浇浈浊测浍济浏浑浒浓浔泿洱涏洀洁洂洃洄洅洆洇洈洊洋洌洎洏洐洑洒洓洔洕洗洠洙洚洛洝洞洟洢洤津洦洧洨洩洪洫洬洭洮洲洳洴洵洶洷洸洹洺活涎浕浉浄浀浂洉洡洣浐洘泚浌洼洽派洿浃浇浈浊测浍济浏浑浒浓浔泿洱涏洀洁洂洃洄洅洆洇洈洊洋洌洎洏洐洑洒洓洔洕洗洠洙洚洛洝洞洟洢洤津洦洧洨洩洪洫洬洭洮洲洳洴洵洶洷洸洹洺活涎浕浉浄浀浂洉洡洣浐洘泚浌洼洽派洿浃浇浈浊测浍济浏浑浒浓浔泿洱涏洀洁洂洃洄洅洆洇洈洊洋洌洎洏洐洑洒洓洔洕洗洠洙洚洛洝洞洟洢洤津洦洧洨洩洪洫洬洭洮洲洳洴洵洶洷洸洹洺活涎`,
 }

 imgSrc = []string{
  "john.jpg""Dijkstra.jpg""tony.jpg""tony1.jpg",
 }
)

/*
 k: a len: 46 48
 k: b len: 184 58
 k: c len: 246 250
 k: d len: 738 274
 snappy jpg
*/

func main() {
 for k, v := range textMap {
  got := snappy.Encode(nil, []byte(v))
  //fmt.Println("原始信息为:",v, "压缩后的信息为:",string(got))
  fmt.Println("k:", k, ", 原长度:"len(v), ", 压缩后的长度:"len(got))
 }

 fmt.Println("snappy压缩 jpg:")
 for _, v := range imgSrc {
  buf, err := ioutil.ReadFile(v)
  if err == nil {
   got := snappy.Encode(nil, buf)
   fmt.Println("k:", v, ", 原长度:"len(buf), ", 压缩后的长度:"len(got))
  }
 }
}

Resultados de:

k: a , 原长度: 46 , 压缩后的长度: 48
k: b , 原长度: 184 , 压缩后的长度: 58
k: c , 原长度: 246 , 压缩后的长度: 250
k: d , 原长度: 738 , 压缩后的长度: 274
snappy压缩 jpg:
k: john.jpg , 原长度: 172909 , 压缩后的长度: 172921
k: Dijkstra.jpg , 原长度: 199459 , 压缩后的长度: 196799
k: tony.jpg , 原长度: 169282 , 压缩后的长度: 169026
k: tony1.jpg , 原长度: 52923 , 压缩后的长度: 52565

  • Si la cadena contiene más caracteres repetidos, la compresión tendrá un efecto mayor.

  • La tasa de compresión de las imágenes jpg no es muy buena e incluso puede aumentar el tamaño...


La compresión consiste en encontrar esas cadenas recurrentes y reemplazarlas con símbolos más cortos. Por ejemplo, AAABBBBCC se puede registrar como 3A4B2C (siempre que se garantice la relación correspondiente, se puede utilizar cualquier carácter para reemplazar esas cadenas repetidas)

Por lo tanto, los datos sin duplicación no se pueden comprimir más. El archivo necesita agregar un campo de verificación, por lo que los datos sin información duplicada serán cada vez más grandes.

El propio .jpg ha sido comprimido (compresión con pérdida), así que...

¿Cuáles son las diferencias entre los formatos de imagen jpg, png, gif, RAW y TIFF? La imagen está dañada y no se puede abrir, ¿se puede reparar? [2]


La información original de las 4 imágenes es la siguiente:

alt

Explicación detallada de los casos de uso de snappy en golang [3]


Otros algoritmos de compresión


  • lz4[4]:综合来看效率最高的压缩算法,更侧重压缩/解压速度,压缩比并不是第一。当前Android和iOS操作系统,内存压缩就使用的是lz4算法,及时压缩内存以节省出更多的内存空间。 使用C编写. 更多 深入浅出lz4压缩算法[5]

  • zstd[6]: 由Facebook研发的快速数据压缩算法,具有更好的压缩比。使用C编写. 更多 zstd - 一种由Facebook使用的快速数据压缩算法[7]

  • zip:作者菲尔·卡茨[8],不愿意为一个压缩软件付钱,索性自己写了一个更好的算法ZIP,然后无偿公开。2000年4月14日,饮酒过量导致急性脾出血,死于一家汽车旅馆,年仅37岁,死时手中握着一个空酒瓶 更多ZIP,一个没落天才的故事[9]


alt

参考资料

[1]

golang/snappy: https://github.com/golang/snappy

[2]

图片格式jpg、png、gif、RAW、TIFF有啥区别,图片受损没法打开,能修复吗?: https://www.sohu.com/a/485790854_120293876

[3]

golang中snappy的使用场合实例详解: jb51.net/article/130763.htm

[4]

lz4: https://github.com/lz4/lz4

[5]

深入浅出lz4压缩算法: https://www.jianshu.com/p/824e1cf4f920

[6]

zstd: https://github.com/facebook/zstd

[7]

zstd - 一种由Facebook使用的快速数据压缩算法: https://www.howtoing.com/zstd-fast-data-compression-algorithm-used-by-facebook

[8]

菲尔·卡茨: https://zh.wikipedia.org/wiki/%E8%8F%B2%E5%B0%94%C2%B7%E5%8D%A1%E8%8C%A8

[9]

ZIP,一个没落天才的故事: https://www.cnbeta.com/articles/tech/185863.htm

本文由 mdnice 多平台发布

Supongo que te gusta

Origin blog.csdn.net/techdashen/article/details/132890623
Recomendado
Clasificación