实现一个文件系统——压缩算法的选择
一直以来对7zip有一种莫名其妙的喜欢,可能是因为它是免费的并且一个几百K的程序就能够提供相当高的压缩比和速度,比RAR用起来感觉舒服多了。因此在选择压缩算法的时候,首先就瞄准了LZMA压缩算法。然而测试的结果却让我大跌眼镜,采用LZMA压缩算法的Java SDK包,随便压缩个什么东东,内存使用量都增长到130M左右,这让我已经根本无法简单的在Eclipse中启动单元测试了。而且速度非常的慢,不知道什么原因。而采用JDK自带的GZIP压缩算法,内存使用量最多也就是30M左右,速度也相当的快,至少比LZMA要快一个级别。
找了几个别人做的测试数据比较:
Compressed file size in bytes
gzip bzip2 lzmash lzmash -e
1 86322815 76147880 67456213 -
2 84858575 74320824 62085798 -
3 83561997 73467586 59547691 59278372
4 81312776 73044026 58245872 57964166
5 79798262 72762041 56694215 56411631
6 79179298 72540199 56182079 55859514
7 78995264 72512833 55535273 55269226
8 78816280 72314472 54678948 54405078
9 78768334 72223858 54068819 53769958
Compressed size / Uncompressed size * 100%
gzip bzip2 lzmash lzmash -e
1 40,6% 35,8% 31,7% -
2 39,9% 34,9% 29,2% -
3 39,3% 34,5% 28,0% 27,9%
4 38,2% 34,3% 27,4% 27,3%
5 37,5% 34,2% 26,7% 26,5%
6 37,2% 34,1% 26,4% 26,3%
7 37,1% 34,1% 26,1% 26,0%
8 37,1% 34,0% 25,7% 25,6%
9 37,0% 34,0% 25,4% 25,3%
Compression time可以看出,GZIP压缩率比LZMA低几个百分点,压缩后的体积大概是LZMA的10%多,但是在压缩和解压速度上,是LZMA的3-6倍,这个还是在Linux下C代码的比对,在Java上的比较估算要速度比要到10倍以上。
gzip bzip2 lzmash lzmash -e
1 11.5s 1m 26s 0m 58s -
2 12.0s 1m 40s 2m 7s -
3 13.7s 1m 54s 4m 58s 7m 37s
4 15.1s 2m 5s 5m 26s 8m 2s
5 18.4s 2m 11s 6m 47s 11m 18s
6 24.5s 2m 18s 7m 30s 12m 4s
7 29.4s 2m 25s 8m 24s 12m 59s
8 45.5s 2m 32s 10m 59s 20m 17s
9 66.9s 2m 37s 12m 20s 21m 56s
Decompression time
gzip bzip2 lzmash lzmash -e
1 3.3s 16.5s 11.3s -
2 3.3s 24.2s 10.5s -
3 3.3s 29.2s 10.5s 10.4s
4 3.3s 32.1s 10.4s 10.3s
5 3.2s 34.2s 10.2s 10.2s
6 3.2s 35.4s 10.2s 10.1s
7 3.2s 36.5s 10.1s 10.0s
8 3.2s 37.5s 10.0s 9.9s
9 3.1s 38.2s 10.0s 9.9s
Compression speed, MB/s of uncompressed data (1 MB = 1024 * 1024 bytes)
gzip bzip2 lzmash lzmash -e
1 18 2.4 3.5 -
2 17 2.0 1.6 -
3 15 1.8 0.68 0.44
4 13 1.6 0.62 0.42
5 11 1.5 0.50 0.30
6 8.3 1.5 0.45 0.28
7 6.9 1.4 0.40 0.26
8 4.5 1.3 0.31 0.17
9 3.0 1.3 0.27 0.15
Decompression speed, MB/s of uncompressed data (1 MB = 1024 * 1024 bytes)
gzip bzip2 lzmash lzmash -e
1 61 12 18 -
2 61 8.4 19 -
3 61 6.9 19 20
4 61 6.3 20 20
5 63 5.9 20 20
6 63 5.7 20 20
7 63 5.6 20 20
8 63 5.4 20 20
9 65 5.3 20 20
因此,看来采用GZIP作为压缩算法无疑是最佳选择了。