怎么样把两个压缩文件压到一起?
简单回答一下,完全可以把多个文件看作一个文件进行压缩,也可以达到你说的压缩效果,但是慢!如果只是在实验室里做实验那是没有问题的,但是做成通用软件的时候需要考虑很多问题。
1. 算法的限制。像比较常用的LZ77,GZIP,snappy这种,在匹配相同字符串的时候是有窗口(history buffer)大小和最大匹配长度限制的。以你说的例子为例,你在遇到第二个100M的时候,你需要往前找100M的位置去找到这个匹配,但是匹配这个100M是需要代价的(包括消耗100M的内存和匹配100M长度所需要的时间),这样会使得压缩过程非常非常非常慢!其次是最大匹配长度问题,同理,在有限的时间内你不可能无限制地要求更长的匹配,都是有一个阈值的。一般情况下,匹配窗口大小通常是几KB到几MB这个级别(snappy是64KB),最大匹配长度就更小了。像LZ78、LZW这些基于字典的也会有字典大小和最大匹配长度问题,不再赘述。
2. 软件对压缩率和压缩速度的折中。简单说,压缩率越大,压缩速度越缦,反之亦然。主要看追求的是怎样的平衡。即便是一味追求压缩率,使用一个算法100M对100M的压缩代价还是很大的,还不如用多层压缩,比如说GZIP用了哈夫曼和LZ77结合。当然你也可以使用文件对文件的查重算法(各种云1秒上传电影的例子),但是这种只适合用在云备份上,暂时不适合用作多文件(量太少不实用,浪费资源)压缩打包。
3. 多文件压缩更倾向每个单独压缩,主要也是性能决定的。比如说你有16个文件要压缩,如果一开始分开压缩,那就可以调动16个线程一起压缩,时间会缩短16倍。然后再花一点时间把各个压缩之后的文件粘一起并添加上元数据。如果是一起压缩,由于压缩算法的并行比较困难,基本都是一个线程在工作(多线程的很多也是先把文件切割成多份,原理同上),这样会慢很多。解压也是一样的,单独压缩的文件可以调动多线程同时解压。另外,在解压时候如果我只需要其中一个文件,这种压缩方式就更有优势了,只需要读元数据并解只压需要的那部分文件,而不需要解压所有文件。
Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有