前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「Go开源包」snappy:google开源的快速、无损压缩包

「Go开源包」snappy:google开源的快速、无损压缩包

作者头像
Go学堂
发布2023-08-29 16:48:48
9400
发布2023-08-29 16:48:48
举报
文章被收录于专栏:Go工具箱Go工具箱

大家好,我是渔夫子。

今天给大家推荐的是一个google开源的快速、无损的压缩包:snappy。

snappy算法是google开源的。该包是google使用go语言来实现的。项目地址如下:

项目地址:https://github.com/golang/snappy

星标:1.4k

使用者:97.7k

简介

该包的目标并不是最大化的压缩比例,也不是和其他压缩库兼容;相反,snappy算法的目标是在合理的压缩率下尽可能的提高压缩速度

例如,与zlib的最快压缩模式相比,snappy依然比其快了一个数量级,但产生的压缩文件要比zip的大20%到100%。

特性

snappy压缩算法具有以下特性:

  • 快速:压缩速度大概在250MB/秒及更快的速度进行压缩。
  • 稳定:在过去的几年中,Snappy在Google的生产环境中压缩并解压缩了数P字节(petabytes)的数据。Snappy位流格式是稳定的,不会在版本之间发生变化
  • 健壮性:Snappy解压缩器设计为不会因遇到损坏或恶意输入而崩溃

性能

Snappy的目标是快速。在64位模式下,一个Corei7处理器的单核上,其压缩速度约为250MB/秒或更快,解压缩速度约为500MB/秒或更快。(这些数字是在我们的基准测试套件中最慢的输入情况下得出的;其他输入会快得多。)在我们的测试中,Snappy通常比同一级别的算法(如LZO、LZF、QuickLZ等)更快,同时实现了类似的压缩率。

示例

我们看下snappy的使用。如下:

代码语言:javascript
复制
package main

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

func main() {
    fmt.Println([]byte("aaa"))
    src1 := []byte("akakakakakakakakakakdddddddddcccccceeeeeeeegggggggggsssss")

    var dst1 []byte
    c := snappy.Encode(dst1, src1)
    fmt.Printf("src1 before compression len:%d\n", len(src1)) 
    fmt.Printf("src1 after compression len:%d\n", len(c))
}

运行代码,可知压缩前字符串是57个字节,压缩后是34个字节。结果如下:

代码语言:javascript
复制
src1 before compression len:57
src1 after compression len:34

但是,有时候你会发现,压缩后会比压缩前字节数变大。这是和原字符串有关系,如果原字符串中重复的字符越少,那么压缩后的长度就有可能会比之前变长。如果原字符串中重复的字符比较多,那么压缩比率就会很高。这也是压缩的基本原理。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Go学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 特性
  • 性能
  • 示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档