圧縮アルゴリズム --- golang/snappy を例に挙げます


圧縮、典型的な空間時間

LRU を使用する場合は、hachicorp/golang-lru が最初の選択肢になりますが、いつからかわかりませんが、Go 公式がひっそりとグループキャッシュを構築し、lru の実装も提供しました...

ざっと調べてみたところ、github.com/golang に加えて、一般的に使用されるコンポーネントの完全なセットがあることがわかりました。たとえば、vscode/sublime プラグインには、パフォーマンス テスト ツール perf、エラー処理ライブラリ xerrors、ログ ライブラリ glog、および単一テスト用のモックが含まれています...圧縮さえも snappy で提供され、データベースは leveldb です。これは単に業界チェーン全体を「ブートストラップ」する試みです


ゴーラン/スナッピー[1]


snappy は Google が開発した圧縮アルゴリズムで、非常に高速で適度な圧縮率(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))
  }
 }
}

結果:

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

  • 文字列に繰り返し文字が多く含まれる場合、圧縮の効果は大きくなります。

  • jpg画像の圧縮率は高くなく、サイズが大きくなる場合もあります...


圧縮とは、繰り返し現れる文字列を見つけて、短い記号に置き換えることです。たとえば、AAABBBBCC は 3A4B2C として記録できます (対応関係が確保されている限り、繰り返される文字列を任意の文字で置き換えることができます)。

したがって、重複のないデータはそれ以上圧縮することができません。ファイルにはチェックフィールドを追加する必要があるため、重複情報のないデータはますます大きくなります。

.jpg自体は圧縮(非可逆圧縮)されているので...

画像形式 jpg、png、gif、RAW、TIFF の違いは何ですか? 画像が破損していて開けません。修復できますか? [2]


4枚の写真の元情報は以下の通りです。

alt

golang での snappy のユースケースの詳細な説明[3]


他の圧縮アルゴリズム


  • 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 多平台发布

おすすめ

転載: blog.csdn.net/techdashen/article/details/132890623