tl;dr(太長不讀):
- zstd是Facebook在2016年開源的新無損壓縮算法呛每,優(yōu)點是壓縮率和壓縮/解壓縮性能都很突出。
- 在我們測試的文本日志壓縮場景中乓诽,壓縮率比gzip提高一倍屎鳍,壓縮性能與lz4、snappy相當甚至更好问裕,是gzip的10倍以上逮壁。
- zstd還有一個特別的功能,支持以訓(xùn)練方式生成字典文件粮宛,相比傳統(tǒng)壓縮方式能大大的提高小數(shù)據(jù)包的壓縮率窥淆。
- 在過去的兩年里,Linux內(nèi)核巍杈、HTTP協(xié)議忧饭、以及一系列的大數(shù)據(jù)工具(包括Hadoop 3.0.0,HBase 2.0.0筷畦,Spark 2.3.0词裤,Kafka 2.1.0)等都已經(jīng)加入了對zstd的支持。
- 可以預(yù)見鳖宾,zstd將是未來幾年里會被廣泛關(guān)注和應(yīng)用的壓縮算法吼砂。
最近了解到了zstd這種新的壓縮算法。不像lz4鼎文,lzo渔肩,snappy等近幾年流行的壓縮算法專注于壓縮和解壓縮性能,zstd在性能不錯的同時號稱壓縮率跟Deflate(zip/gzip的算法)相當拇惋。下面是官網(wǎng)列出的數(shù)據(jù):
我們知道周偎,壓縮算法的效果和性能跟被壓縮的數(shù)據(jù)類型和模式有很大的關(guān)系,光看別人的測試數(shù)據(jù)撑帖、benchmark是不夠的蓉坎。正好有功能開發(fā)需要,于是結(jié)合我們的使用場景真實測試的一下胡嘿。
驚喜的是蛉艾,實測的結(jié)果比官方提供的還好,終于找到了我們的cup of tea。
測試環(huán)境
Intel(R) Core(TM) i5-4570 CPU @ 3.20GHz, 8G內(nèi)存
CentOS 7.0
測試對象
對幾種支持流式寫入的壓縮算法伺通,使用對應(yīng)的命令行工具進行壓縮測試箍土。
壓縮算法 | 工具名稱 | 默認壓縮級別 | 版本 | 安裝方法 |
---|---|---|---|---|
deflate | gzip | 5 | 1.5 | centos自帶 |
snappy | snzip | n/a | 1.0.4 | https://github.com/kubo/snzip 編譯安裝 |
lz4 | lz4 | 0 | 1.7.3 | yum install lz4 |
lzo | lzop | 0 | 2.06 | yum install lzop |
zstd | zstd | 3 | 1.3.8 | yum install zstd |
除了snappy,各種壓縮算法/工具都支持設(shè)置壓縮級別罐监,高級別意味著以更長的壓縮時間換取更高的壓縮率吴藻。
測試輸入
100萬行不重復(fù)的某個應(yīng)用的日志文件,大小為977MB弓柱。
測試結(jié)果
大文件壓縮
從上面可以看出:
- 解壓時間各種算法差別不大
- 壓縮時間(越小越好):
lz4, zstd < lzo < snappy << gzip-1 < lz4-9 < gzip < gzip-9 < lzo-9
- 壓縮率(越大越好):
zstd-10 > zstd >> lz4-9 > gzip-9 > gzip, lzo-9 >> lz4, gzip-1 > snappy, lzo
zstd無論從處理時間還是壓縮率來看都占優(yōu)沟堡。snappy, lz4, lzo的壓縮率較低,但壓縮速度都很快矢空,而zstd甚至比這些算法更快航罗。Gzip的壓縮率比lz4等高不少,而zstd的壓縮率比gzip還提升一倍屁药。
如果從上面的比較還不是特別直觀的話粥血,我們再引入一個創(chuàng)造性的指標(從網(wǎng)上其他壓縮算法對比沒有見過使用這項指標):
壓縮效率 = 權(quán)重系數(shù) * 壓縮去掉的冗余數(shù)據(jù)大小 / 壓縮時間
代表單位處理時間可以壓縮去掉多少冗余數(shù)據(jù)。其中權(quán)重系數(shù)
用來指定壓縮率和壓縮速度哪個更重要酿箭,這里我們認為在我們的使用場景里兩者同樣重要复亏,取系數(shù)為1。
從這里我們可以明顯看出缭嫡,zstd > lz4 > lzo > snappy >> 其他
缔御。
小數(shù)據(jù)量壓縮
對1000行、大小約為1MB的文件進行壓縮測試妇蛀,各種算法的壓縮率跟1GB大文件的壓縮率幾乎一樣耕突。
下面再對更小的數(shù)據(jù)量——10行日志數(shù)據(jù)的壓縮率進行對比。雖然我們的使用場景里沒有對小數(shù)據(jù)量的壓縮處理评架,但還是比較好奇zstd字典模式的效果眷茁。
其中最后一組數(shù)據(jù)為zstd使用10000行日志進行訓(xùn)練生成字典文件,并利用字典文件輔助壓縮測試數(shù)據(jù)古程。
可以看出來蔼卡,除了zstd字典模式外,各種壓縮算法在處理更小的數(shù)據(jù)量時壓縮率都下降很多挣磨。而zstd字典模式對壓縮率帶來幫助非常明顯,與gzip對比荤懂,壓縮率從1000行時相差1倍茁裙,到10行時變?yōu)榱讼嗖罱咏?倍。
結(jié)論
- 對大數(shù)據(jù)量的文本壓縮場景节仿,zstd是綜合考慮壓縮率和壓縮性能最優(yōu)的選擇晤锥,其次是lz4。
- 對小數(shù)據(jù)量的壓縮場景,如果能使用zstd的字典方式矾瘾,壓縮效果更為突出女轿。
- 綜上所述,zstd憑著優(yōu)異的特性壕翩,今后應(yīng)用將會越來越廣蛉迹,值得及早了解和嘗試。
下一篇文章將給大家對比這幾種算法的golang開源庫的性能和壓縮率放妈。敬請期待北救。