压缩算法的比较

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了压缩算法的比较相关的知识,希望对你有一定的参考价值。

参考技术A 压缩对象是一个大小为1.7M的csv文件,总共6829行,每行74列,即一行大小为261byte
使用全Double类型(一个Double为8字节)保存一行数据的话,一行为592byte
使用更适合的数据类型时(-125-124用Byte保存,浮点型用Float保存,其余用short保存,各别较大的整数用int保存),一行为143byte

由上图可知当压缩行数为40行时,bzip压缩比例达到11,gzip压缩比例达到9

由上图知,当压缩行数为150时,gzip压缩比例为10并收敛,而bzip压缩比例在行数为500时达到18(行数为1000时压缩比例为20,此处不画出)

由上图知,除bzip外,其余算法压缩时间变化不大,且远下于bzip,bzip算法随着压缩行数增加,压缩时间减少但仍然高于gzip

根据数据以及以上两图,gzip的压缩性价比最好,bzip随着压缩行数增加,性价比提高,但仍比gzip差

压缩能力Bzip > Gzip ≈ Snappy ≈ Lz4 ≈ Lzo
耗费时间 Bzip > Gzip ≈ Snappy ≈ Lz4 ≈ Lzo
压缩性价比 Gzip > Snappy ≈Lz4 ≈ Lzo >Bzip

由上图可知,bzip压缩比例最好,在500行时达到5(不会再变化),gzip次之,在30行时达到3并收敛

由上图可知,bzip压缩耗时最多,并随着压缩行数增加而减少,但仍高于gzip

由上图可知,gzip与snappy压缩性价比相近,而bzip压缩性价比在行数达到150时接近bzip并收敛

Linux下打包和解压

Linux下使用tar命令来进行打包和解压的操作,再搭配常见压缩算法,可以实现对文件的压缩打包解压缩,常见的压缩算法有gzip,bzip2,还有deflate、snappy等其他的,这里不做记录。

压缩

通过算法,将文件尺寸进行相应缩小,同时不损失文件内容。常用压缩算法如gzip和bzip2,使用压缩算法后文件名分别为*.gz和*.bz2。使用旧的compress算法压缩的文件名为*.Z,目前比较少用。

gzip

gzip压缩解压使用命令 gzip [选项] 文件名,其中有如下常用选项。

(1)-c:将压缩的数据输出到标准输出stdout,一般是乱码

(2)-d:解压缩

(3)-v:显示压缩文件/原文件压缩比

(4)-l:查看压缩文件压缩比

(5)-(1~9):1代表更快的压缩,9代表更高的压缩比,默认为6

(6)-t:检查一个压缩文件的一致性

gzip -c 标准输出,是乱码。

直接压缩,发现原始文件会被删除。

解压, 原始文件被删除。

使用如下数据重导向,可以让原文件还保存 。

使用-9来提压缩比,对比发现确实有所提高。

# 使用-9提高压缩比
[root@node01 /home/yangchaolin]# gzip -9 secure [root@node01 /home/yangchaolin]# ll -lh total 52K
# 压缩完2.1k,压缩比88.5%
-rw-r--r--. 1 root root 22K Oct 20 01:25 log.txt -rw-r--r--. 1 root root 2.1K Oct 20 03:22 primeNumber -rw-------. 1 root root 18K Oct 20 08:45 secure_bak -rw-------. 1 root root 2.1K Oct 20 08:35 secure.gz [root@node01 /home/yangchaolin]# gzip -l secure.gz compressed uncompressed ratio uncompressed_name 2135 18311 88.5% secure [root@node01 /home/yangchaolin]# gzip -d secure.gz [root@node01 /home/yangchaolin]# ll -lh total 68K -rw-r--r--. 1 root root 22K Oct 20 01:25 log.txt -rw-r--r--. 1 root root 2.1K Oct 20 03:22 primeNumber -rw-------. 1 root root 18K Oct 20 08:35 secure -rw-------. 1 root root 18K Oct 20 08:45 secure_bak # 使用默认-6压缩
[root@node01
/home/yangchaolin]# gzip -v secure secure: 88.4% -- replaced with secure.gz
# 压缩完2.2k,压缩比88.4%,压缩比略微比-9低一点 [root@node01
/home/yangchaolin]# ll -lh total 52K -rw-r--r--. 1 root root 22K Oct 20 01:25 log.txt -rw-r--r--. 1 root root 2.1K Oct 20 03:22 primeNumber -rw-------. 1 root root 18K Oct 20 08:45 secure_bak -rw-------. 1 root root 2.2K Oct 20 08:35 secure.gz
# 检查压缩文件,无错误 [root@node01
/home/yangchaolin]# gzip -t secure.gz

bzip2

bzip2压缩解压使用命令 bzip2 [选项] 文件名,常用选项跟gzip类似。

(1)-c:将压缩的数据输出到标准输出stdout,一般是乱码

(2)-d:解压缩

(3)-k:压缩会保留原文件

(4)-v:显示压缩文件/原文件压缩比

(5)-(1~9):1代表更快的压缩,9代表更高的压缩比

(6)-t:验证压缩后文件完整性

 下面将上面选项操作一下。

[root@node01 /home/yangchaolin]# ll -lh
total 68K
-rw-r--r--. 1 root root  22K Oct 20 01:25 log.txt
-rw-r--r--. 1 root root 2.1K Oct 20 03:22 primeNumber
-rw-------. 1 root root  18K Oct 20 09:16 secure
-rw-------. 1 root root  18K Oct 20 08:45 secure_bak
# bzip2默认压缩,可以看出压缩比很高
[root@node01
/home/yangchaolin]# bzip2 secure [root@node01 /home/yangchaolin]# ll -lh total 52K -rw-r--r--. 1 root root 22K Oct 20 01:25 log.txt -rw-r--r--. 1 root root 2.1K Oct 20 03:22 primeNumber -rw-------. 1 root root 18K Oct 20 08:45 secure_bak -rw-------. 1 root root 2.1K Oct 20 09:16 secure.bz2
# 解压,待继续测试 [root@node01
/home/yangchaolin]# bzip2 -d secure.bz2 [root@node01 /home/yangchaolin]# ll total 68 -rw-r--r--. 1 root root 21529 Oct 20 01:25 log.txt -rw-r--r--. 1 root root 2078 Oct 20 03:22 primeNumber -rw-------. 1 root root 18311 Oct 20 09:16 secure -rw-------. 1 root root 18311 Oct 20 08:45 secure_bak
# -v可以显示压缩比 [root@node01
/home/yangchaolin]# bzip2 -v secure secure: 8.757:1, 0.914 bits/byte, 88.58% saved, 18311 in, 2091 out. [root@node01 /home/yangchaolin]# ll -lh total 52K -rw-r--r--. 1 root root 22K Oct 20 01:25 log.txt -rw-r--r--. 1 root root 2.1K Oct 20 03:22 primeNumber -rw-------. 1 root root 18K Oct 20 08:45 secure_bak -rw-------. 1 root root 2.1K Oct 20 09:16 secure.bz2
# -t检查压缩文件完整性 [root@node01
/home/yangchaolin]# bzip2 -t secure.bz2
# 解压 [root@node01
/home/yangchaolin]# bzip2 -d secure.bz2 [root@node01 /home/yangchaolin]# ll -lh total 68K -rw-r--r--. 1 root root 22K Oct 20 01:25 log.txt -rw-r--r--. 1 root root 2.1K Oct 20 03:22 primeNumber -rw-------. 1 root root 18K Oct 20 09:16 secure -rw-------. 1 root root 18K Oct 20 08:45 secure_bak
# -k可以保留原文件 [root@node01
/home/yangchaolin]# bzip2 -k secure [root@node01 /home/yangchaolin]# ll -lh total 72K -rw-r--r--. 1 root root 22K Oct 20 01:25 log.txt -rw-r--r--. 1 root root 2.1K Oct 20 03:22 primeNumber
# 原文件未被删除
-rw-------. 1 root root 18K Oct 20 09:16 secure -rw-------. 1 root root 18K Oct 20 08:45 secure_bak -rw-------. 1 root root 2.1K Oct 20 09:16 secure.bz2

一般来说,bzip2拥有更高的压缩比,gzip拥有更快的压缩速度。

可以使用zcat查看gzip算法压缩后的文本内容,使用bzcat查看bzip2压缩算法压缩后的文本内容。

[root@node01 /home/yangchaolin]# zcat secure.gz
Oct 14 22:55:03 node01 sshd[1221]: Server listening on 0.0.0.0 port 22.
Oct 14 22:55:03 node01 sshd[1221]: Server listening on :: port 22.
...省略 [root@node01 /home/yangchaolin]# ll total 56 -rw-r--r--. 1 root root 21529 Oct 20 01:25 log.txt -rw-r--r--. 1 root root 2078 Oct 20 03:22 primeNumber -rw-------. 1 root root 18311 Oct 20 08:45 secure_bak -rw-------. 1 root root 2091 Oct 20 09:16 secure.bz2 -rw-------. 1 root root 2161 Oct 20 09:16 secure.gz [root@node01 /home/yangchaolin]# bzcat secure.bz2 Oct 14 22:55:03 node01 sshd[1221]: Server listening on 0.0.0.0 port 22. Oct 14 22:55:03 node01 sshd[1221]: Server listening on :: port 22.
...省略

打包和解压

使用tar命令,配合上面的gzip和bzip2,可以对一个文件进行压缩和解压,以gzip压缩算法为例,语法如下,bzip2的后缀换成bz2。

打包压缩语法:tar [选项] 新文件名.tar.gz 原始文件名

包解压语法:tar [选项] 文件名.tar.gz [-C 目标路径],如果没有指定目标路径就解压到当前目录,-C就是指定目标路径的。

常用选项如下。

(1)-c:打包

(2)-x:解压包

(3)-z:通过gzip支持的压缩和解压缩,文件名*.tar.gz

(4)-j:通过bzip2支持的压缩和解压缩,文件名*.tar.bz2

(5)-v:压缩解压缩的过程中将正在处理的文件名显示出来

(6)-f:后面跟处理文件的全路径,即路径+文件+后缀

(7)-C:如果解压到特定目录,需要使用它

(8)-t:查看打包文件的内容

 常用的就是-zcvf组合,-zxvf组合了,在安装软件时常用,下面演练一下。

# 使用gzip压缩打包,显示正在处理的文件名
[root@node01 /home/yangchaolin]# tar -zcvf secure.tar.gz secure
# 显示的文件名 secure [root@node01
/home/yangchaolin]# ll total 80 -rw-r--r--. 1 root root 21529 Oct 20 01:25 log.txt -rw-r--r--. 1 root root 2078 Oct 20 03:22 primeNumber -rw-------. 1 root root 18311 Oct 20 09:47 secure -rw-------. 1 root root 18311 Oct 20 08:45 secure_bak -rw-------. 1 root root 2091 Oct 20 09:16 secure.bz2 -rw-------. 1 root root 2161 Oct 20 09:16 secure.gz -rw-r--r--. 1 root root 2229 Oct 20 09:48 secure.tar.gz
# 使用bzip2压缩打包,显示正在处理的文件名 [root@node01
/home/yangchaolin]# tar -jcvf secure.tar.bz2 secure
# 显示文件名 secure [root@node01
/home/yangchaolin]# ll -lh total 84K -rw-r--r--. 1 root root 22K Oct 20 01:25 log.txt -rw-r--r--. 1 root root 2.1K Oct 20 03:22 primeNumber -rw-------. 1 root root 18K Oct 20 09:47 secure -rw-------. 1 root root 18K Oct 20 08:45 secure_bak -rw-------. 1 root root 2.1K Oct 20 09:16 secure.bz2 -rw-------. 1 root root 2.2K Oct 20 09:16 secure.gz
# 使用压缩算法打包后两文件
-rw-r--r--. 1 root root 2.2K Oct 20 09:48 secure.tar.bz2 -rw-r--r--. 1 root root 2.2K Oct 20 09:48 secure.tar.gz # 使用gzip解压,注意使用-x代表解压 [root@node01 /home/yangchaolin]# tar -zxvf secure.tar.gz secure [root@node01 /home/yangchaolin]# ll total 84 -rw-r--r--. 1 root root 21529 Oct 20 01:25 log.txt -rw-r--r--. 1 root root 2078 Oct 20 03:22 primeNumber -rw-------. 1 root root 18311 Oct 20 09:47 secure -rw-------. 1 root root 18311 Oct 20 08:45 secure_bak -rw-------. 1 root root 2091 Oct 20 09:16 secure.bz2 -rw-------. 1 root root 2161 Oct 20 09:16 secure.gz -rw-r--r--. 1 root root 2201 Oct 20 09:48 secure.tar.bz2 -rw-r--r--. 1 root root 2229 Oct 20 09:48 secure.tar.gz # 创建目录用于保存加压文件 [root@node01 /home/yangchaolin]# mkdir decompress [root@node01 /home/yangchaolin]# ll total 88 drwxr-xr-x. 2 root root 4096 Oct 20 09:52 decompress -rw-r--r--. 1 root root 21529 Oct 20 01:25 log.txt -rw-r--r--. 1 root root 2078 Oct 20 03:22 primeNumber -rw-------. 1 root root 18311 Oct 20 09:47 secure -rw-------. 1 root root 18311 Oct 20 08:45 secure_bak -rw-------. 1 root root 2091 Oct 20 09:16 secure.bz2 -rw-------. 1 root root 2161 Oct 20 09:16 secure.gz -rw-r--r--. 1 root root 2201 Oct 20 09:48 secure.tar.bz2 -rw-r--r--. 1 root root 2229 Oct 20 09:48 secure.tar.gz
# 使用gzip解压,-C指定解压后目录 [root@node01
/home/yangchaolin]# tar -zxvf secure.tar.gz -C /home/yangchaolin/decompress/ secure [root@node01 /home/yangchaolin]# cd decompress/
# 查看已解压完成 [root@node01 /home/yangchaolin/decompress]# ll total 20 -rw-------. 1 root root 18311 Oct 20 09:47 secure [root@node01 /home/yangchaolin/decompress]# ll total 20 -rw-------. 1 root root 18311 Oct 20 09:47 secure [root@node01 /home/yangchaolin/decompress]# rm -rf secure [root@node01 /home/yangchaolin/decompress]# ll total 0 [root@node01 /home/yangchaolin/decompress]# cd .. [root@node01 /home/yangchaolin]# ll total 88 drwxr-xr-x. 2 root root 4096 Oct 20 09:53 decompress -rw-r--r--. 1 root root 21529 Oct 20 01:25 log.txt -rw-r--r--. 1 root root 2078 Oct 20 03:22 primeNumber -rw-------. 1 root root 18311 Oct 20 09:47 secure -rw-------. 1 root root 18311 Oct 20 08:45 secure_bak -rw-------. 1 root root 2091 Oct 20 09:16 secure.bz2 -rw-------. 1 root root 2161 Oct 20 09:16 secure.gz -rw-r--r--. 1 root root 2201 Oct 20 09:48 secure.tar.bz2 -rw-r--r--. 1 root root 2229 Oct 20 09:48 secure.tar.gz
# 使用bz2解压,-C指定解压后目录 [root@node01
/home/yangchaolin]# tar -jxvf secure.tar.bz2 -C /home/yangchaolin/decompress/ secure [root@node01 /home/yangchaolin]# cd decompress/
# 查看发现已解压 [root@node01 /home/yangchaolin/decompress]# ll total 20 -rw-------. 1 root root 18311 Oct 20 09:47 secure

以上是对压缩解压缩,打包和解压缩包的整理,留着后面查看用。

以上是关于压缩算法的比较的主要内容,如果未能解决你的问题,请参考以下文章

大数据压缩算法总结

BrotliDeflateZopfliLZMALZHAMBzip2六种无损数据压缩性能比较

为啥使用LZMA2算法压缩的文件,想从中提取某一文件时要解压(计算)完整个压缩包才能解出来?

C# 霍夫曼二叉树压缩算法实现

几种主流贴图压缩算法的实现原理

Linux下打包和解压