文件压缩与解压性能对比 lzop, gzip
关于 lzo
LZO is a portable lossless data compression library written in ANSI C.
LZO是一个超级强大的压缩库,最大的特点就是压缩/解压速度极快。LZO 除了极快的压缩和解压速度以外,最重要的特性就是就地解压,即不使用临时文件,这对于体积较大的文件来说,例如光盘映像,是非常合适的。另外,解压无需内存,解压速度与压缩率无关,这两个也是特别棒的特性,相比较小的压缩率(现在随着大硬盘的普及,压缩率与压缩时间相比,前者显得不再那么重要了),速度上的提高带来的优势无疑太巨大了!
关于 lzop
lzop is a file compressor which is very similar to [gzip](http://www.gzip.org/). lzop uses the [LZO data
compression library](http://www.oberhumer.com/opensource/lzo/) for compression services, and its main
advantages over gzip are much higher compression and decompression speed (at the cost of some compression
ratio).
直接yum安装
> yum install -y lzop
或者编译安装
先要安装LZO库
> cd /usr/local
> wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.10.tar.gz
> tar -xzf lzo-2.10.tar.gz
> cd /usr/local/lzo-2.10
> ./configure --enable-shared
> make && make install
从输出的信息看,lzo库被安装在了 /usr/local/lib
将库文件复制至/usr/lib,如果是64位系统则是 /usr/lib64
> cp /usr/local/lib/*lzo* /usr/lib64/
否则会在后续执行lzop命令时出现类似如下的提示 lzop: error while loading shared libraries: liblzo2.so.2: cannot open shared object file: No such file or directory
> ls /usr/lib64/*lzo*
/usr/lib64/liblzo2.a /usr/lib64/liblzo2.la /usr/lib64/liblzo2.so /usr/lib64/liblzo2.so.2 /usr/lib64/liblzo2.so.2.0.0
编译安装 lzop工具
> cd /usr/local
> wget http://www.lzop.org/download/lzop-1.04.tar.gz
> tar -xzf lzop-1.04.tar.gz
> cd lzop-1.04
> ./configure
> make && make install
> lzop -V
Lempel-Ziv-Oberhumer Packer
Copyright (C) 1996 - 2017
lzop v1.04 Markus Franz Xaver Johannes Oberhumer Aug 10th 2017
lzop version: v1.04, Aug 10th 2017
lzop build date: Feb 23 2023 11:18:26
使用
> lzop --help
Lempel-Ziv-Oberhumer Packer
Copyright (C) 1996 - 2010
lzop v1.03 Markus Franz Xaver Johannes Oberhumer Nov 1st 2010
Usage: lzop [-dxlthIVL19] [-qvcfFnNPkUp] [-o file] [-S suffix] [file..]
Commands:
-1 compress faster -9 compress better
-d decompress -x extract (same as -dPp)
-l list compressed file -I display system information
-t test compressed file -V display version number
-h give this help -L display software license
Options:
-q be quiet -v be verbose
-c write on standard output -oFILE write output to 'FILE'
-p write output to current dir -pDIR write to path 'DIR'
-f force overwrite of output files
-n do not restore the original file name (default)
-N restore the original file name
-P restore or save the original path and file name
-S.suf use suffix .suf on compressed files
-U delete input files after successful operation (like gzip and bzip2)
file.. files to (de)compress. If none given, try standard input.
lzop -v test # 创建test.lzo压缩文件,输出详细信息,保留test文件不变
lzop -Uv test # 创建test.lzo压缩文件,输出详细信息,删除test文件
lzop -t test.lzo # 测试test.lzo压缩文件的完整性
lzop –info test.lzo # 列出test.lzo中各个文件的文件头
lzop -l test.lzo # 列出test.lzo中各个文件的压缩信息
lzop –ls test.lzo # 列出test.lzo文件的内容,同ls -l功能
cat test | lzop > t.lzo # 压缩标准输入并定向到标准输出
lzop -dv test.lzo # 解压test.lzo得到test文件,输出详细信息,保留test.lzo不变
lzop -d test.lzo # 解压,每个文件将与压缩文件放在同一个目录中
lzop -x test.lzo # 将压缩文件解压缩到当前工作目录。这和 -dPp 一样。
压缩级别:从 1 到 9,1表示压缩的最快,9表示压缩的最多,默认是3,数值越大压缩比例越大同时越慢。解压缩速度不受压缩级别的影响。
压缩与解压
生成一个文件 pg135.txt
,大小3.16M
> time gzip -3 pg135.txt
real 0m0.097s
user 0m0.078s
sys 0m0.031s
> time lzop pg135.txt
real 0m0.030s
user 0m0.016s
sys 0m0.016s
> time gzip -d pg135.txt.gz
real 0m0.036s
user 0m0.031s
sys 0m0.000s
> time lzop -d pg135.txt.lzo
real 0m0.026s
user 0m0.000s
sys 0m0.031s
压缩格式 | 文件 | 大小 | 压缩时间 | 解压时间 |
---|---|---|---|---|
None | pg135.txt | 3.16M | ||
GZIP | pg135.txt.gz | 1.32M | 0.097s | 0.036s |
LZO | pg135.txt.lzo | 1.96M | 0.030s | 0.026s |
总结:gzip 的压缩率高一些,但是压缩和解压时间比较长。
gzip 参数。
选项 | 含义 |
---|---|
-c | 将压缩数据输出到标准输出中,并保留源文件。 |
-d | 对压缩文件进行解压缩。 |
-r | 递归压缩指定目录下以及子目录下的所有文件。 |
-v | 对于每个压缩和解压缩的文件,显示相应的文件名和压缩比。 |
-l | 对每一个压缩文件,显示以下字段:压缩文件的大小;未压缩文件的大小;压缩比;未压缩文件的名称。 |
-数字 | 用于指定压缩等级,-1 压缩等级最低,压缩比最差;-9 压缩比最高。默认压缩比是 -6。 |
gzip压缩默认会删掉源文件,不过也可以通过参数保留源文件。
gzip -c big_data.log > big_data.log.gz
无论是 gzip 还是 lzop 都是压缩工具,目标是文件,因此不会作用于目录上,通常的做法是先使用 tar 命令将目录打包为 .tar
文件,然后执行压缩,最终得到 .tar.gz
文件。
分块与并行处理
lzo 是基于block分块的(约256K),这样他就允许数据被分解成chunk,可以使用并行处理,流式处理。
gzip 压缩方式不能被分块,因此无法并行处理。
bzip2 压缩非常的快,也可以被分块,但是其解压过程非常非常的缓慢。
所谓分块并并行处理,就是先将大文件分块,然后由多个下游程序并行来处理,也就是 mapreduce,那么并行处理的结果需要能够按照正确的顺序合并到一起。
综合考虑
如果要求并行处理,压缩和解押压速度快,那么就选 lzo;如果单纯的追求压缩比,那么选 gzip。
其他
golang封装lzo:https://github.com/cyberdelia/lzo
lzo 压缩算法原理 https://blog.csdn.net/wo6694458/article/details/76099768
gzip 压缩算法原理 https://www.jianshu.com/p/4033028e5570
参考
https://blog.thinkeridea.com/201906/go/compress_file_io_optimization1.html