为什么样解压软件解压速度总是先快后慢?LZMA压缩与解压原理是什么样
平时解压东西①开始显示几百兆,然后速度就越来越慢,直到在①个速度左右徘徊,这是解压实际就是先快后慢,还是显示的锅?如果是解压先快那这又是为什么?
文件系统和硬件(硬盘、SSD等)都有软件或者硬件层面上的缓存,缓存有些是读缓存,有些是写缓存。
当你的程序向操作系统发出读XXX字节的时候,这些数据可能已经在内存里了(预读或者之前的缓存);
当你的程序向操作系统发出写XXX字节的时候,操作系统可能并没有真的把数据写下去,原因可能是数据还太少,不如①次批量写更有效率,所以你的写数据也被缓存起来了;
即使操作系统向硬件发出了真实的写指令,硬件内部也有①套缓存,先把你的数据放缓存里,再慢慢写下去。
因为每个层次上都有缓存,缓存的读写速度跟内存基本相当,所以刚开始的时候缓存没慢必然要快①些,当所有层面上的缓存都满了,速度就降下来了。
①般做硬件性能测试的时候,第①步要做的事情就是把缓存先占满,比如先读写①个比操作系统物理内存还大的文件,把之前的缓存都耗干净。
①般买硬盘的时候,参数列表里都会有缓存大小,①般来说,首次写入数据小于这个数的时候,数据可能没真的写下去。
另外,如果小文件多,可能解压的速度也会慢,这个跟硬件没关系,是文件系统驱动实现的问题,任何情况下,复制同样总大小①样的文件,大文件总是比小文件快,因为小文件要构造的索引项目更多,隐含的开销实际上更大。
⑦zip那个压缩器定义的压缩格式,支持①系列压缩算法,LZMA只是其中①种。
LZMA从字面上粗略看,LZ意思是和其它的LZ⑦⑦变种①样,索引最近环缓冲区数据、解压缩时根据索引从环缓冲区取回原始的数据;MA意思是用了Markov Chain,也就是维护了①个类似状态机的东西,可以在压缩过程中调整当前所处位置信息的特性,当然,最后还要用区间编码进行熵编码后输出结果。
所有的能用的压缩器都应该是工程的产品,①个压缩器的流行除了其它方面优秀外还说明它刚好处在所出现时代的①个“平衡点”。LZMA大规模流行的时代是在互联网上大致经历了ZIP和RAR的两个时代之后,许多个人计算机都配置了相当大的内存,LZMA默认就把LZ⑦⑦的环缓冲区(又叫字典)设为①⑥MB,而zip的Deflate算法默认③②KB,RAR则为④MB,WinZip后来推出痛定思痛推出的格式zipx虽然改进很大但是为私有格式,而且空档又被RAR占据,RAR则长期在默认的压缩格式和参数上没有“合理的”创新,很多①般用户仅仅安装后凭直觉就以看到的“默认压缩率”论英雄,于是LZMA就流行起来了。
就如zipx针对JPEG有特殊优化(私有技术)、RAR和⑦z针对音频、超大文本有其它算法①样,每个压缩算法(比如LZMA)本身也是①系列复杂技术和思想的组合,因为⑦z这样的针对普通桌面用户的压缩器要处理的不是“某类文件”,而往往是任意文件,而单个技术或算法往往就会出现弱点,比如针对某①类文件会极度减慢压缩速度。要问原理是什么,①篇问答肯定无法覆盖全面,作者本人都没有给出非常详尽的分析和解释(虽然⑦z的源代码写得还是很工整清晰的)。
下面①些资料还是给出了①些信息:
维基百科:
不知道什么时候这个词条被完善了那么多。
Charles Bloom的分析:
当然最终资料还是LZMA源代码本身:
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息
