前言
項(xiàng)目中遇到的壓縮/解壓縮需求應(yīng)該是很多的,比如典型的考慮網(wǎng)絡(luò)傳輸延時(shí)而對(duì)數(shù)據(jù)進(jìn)行壓縮傳輸,又或者其他各種省空間存儲(chǔ)需求等。這次同樣是遇到了類(lèi)似需求,在做一個(gè)爬蟲(chóng)時(shí),因?yàn)樽ト№?xiàng)目還未確定,所以考慮將整個(gè)html頁(yè)面壓縮存儲(chǔ)于數(shù)據(jù)庫(kù),于是又是各種google,最后不出意外的google到了google家的Snappy :-)
google 自家的snappy 壓縮優(yōu)點(diǎn)是非常高的速度和合理的壓縮率。壓縮率比gzip 小,CPU 占用小。
golang中snappy使用場(chǎng)合
下面是對(duì)幾個(gè)簡(jiǎn)單的字符串做snappy 壓縮前后對(duì)比:
package main
import (
"fmt"
"github.com/golang/snappy"
"io/ioutil"
)
var (
textMap = map[string]string{
"a": `1234567890-=qwertyuiop[]\';lkjhgfdsazxcvbnm,./`,
"b": `1234567890-=qwertyuiop[]';lkjhgfdsazxcvbnm,./1234567890-=qwertyuiop[]\';lkjhgfdsazxcvbnm,./1234567890-=qwertyuiop[]';lkjhgfdsazxcvbnm,./1234567890-=qwertyuiop[]\';lkjhgfdsazxcvbnm,./`,
"c": `浕浉浄浀浂洉洡洣浐洘泚浌洼洽派洿浹澆湞濁測(cè)澮濟(jì)瀏渾滸濃潯泿洱涏洀潔洂洃洄洅洆洇洈洊洋洌洎洏洐洑灑洓洔洕洗洠洙洚洛洝洞洟洢洤津洦洧洨洩洪洫洬洭洮洲洳洴洵洶洷洸洹洺活涎`,
"d": `浕浉浄浀浂洉洡洣浐洘泚浌洼洽派洿浹澆湞濁測(cè)澮濟(jì)瀏渾滸濃潯泿洱涏洀潔洂洃洄洅洆洇洈洊洋洌洎洏洐洑灑洓洔洕洗洠洙洚洛洝洞洟洢洤津洦洧洨洩洪洫洬洭洮洲洳洴洵洶洷洸洹洺活涎浕浉浄浀浂洉洡洣浐洘泚浌洼洽派洿浹澆湞濁測(cè)澮濟(jì)瀏渾滸濃潯泿洱涏洀潔洂洃洄洅洆洇洈洊洋洌洎洏洐洑灑洓洔洕洗洠洙洚洛洝洞洟洢洤津洦洧洨洩洪洫洬洭洮洲洳洴洵洶洷洸洹洺活涎浕浉浄浀浂洉洡洣浐洘泚浌洼洽派洿浹澆湞濁測(cè)澮濟(jì)瀏渾滸濃潯泿洱涏洀潔洂洃洄洅洆洇洈洊洋洌洎洏洐洑灑洓洔洕洗洠洙洚洛洝洞洟洢洤津洦洧洨洩洪洫洬洭洮洲洳洴洵洶洷洸洹洺活涎`,
}
imgSrc = []string{
"1.jpg", "2.jpg", "3.jpg", "4.jpg",
}
)
func main() {
for k, v := range textMap {
got := snappy.Encode(nil, []byte(v))
fmt.Println("k:", k, "len:", 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:", len(buf), len(got))
}
}
}
輸出:
k: a len: 46 48
k: b len: 184 58
k: c len: 246 250
k: d len: 738 274
snappy jpg
k: 1.jpg len: 302829 282525
k: 2.jpg len: 89109 89051
k: 3.jpg len: 124463 123194
k: 4.jpg len: 420886 368608
如果字符串包含重復(fù)字符多壓縮才看到效果,對(duì)jpg 圖片的壓縮率不大。
對(duì)一個(gè)實(shí)際使用的數(shù)據(jù)庫(kù)是否使用snappy 做對(duì)比,用戶(hù)和文章都是10萬(wàn),文章內(nèi)容較簡(jiǎn)單。
使用snappy 壓縮前:
用時(shí) 4m32.916312692s
數(shù)據(jù)庫(kù)占用空間 176,209,920 字節(jié)(磁盤(pán)上的 172 MB)
使用snappy 壓縮后:
用時(shí) 4m6.750271414s
數(shù)據(jù)庫(kù)占用空間 159,424,512 字節(jié)(磁盤(pán)上的 150.9 MB)
從使用時(shí)間上看,此例壓縮使用的CPU 時(shí)間小于數(shù)據(jù)壓縮后省下來(lái)的數(shù)據(jù)存儲(chǔ)IO 占用的時(shí)間。因?yàn)槲恼聰?shù)據(jù)較短、內(nèi)容簡(jiǎn)單,壓縮效果不明顯。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
您可能感興趣的文章:- Go語(yǔ)言壓縮和解壓縮tar.gz文件的方法
- go語(yǔ)言制作的zip壓縮程序
- GO語(yǔ)言實(shí)現(xiàn)批量壓縮圖片和水印
- go語(yǔ)言通過(guò)zlib壓縮數(shù)據(jù)的方法
- Golang使用zlib壓縮和解壓縮字符串
- Go 語(yǔ)言中g(shù)in使用gzip壓縮遇到的問(wèn)題