我认为最好总结一下GZIP、BZIP2和LZMA的内部结构,以明确如下内容:
- GZIP实际上是一种使用Deflate算法的格式。由于静态的huffman代码(平减文档也提到了动态huffman,但实际上它们也是静态的),应该将平减编码为块(滑动窗口是这里的另一个术语)。C似乎找到了这些块的边界,并尝试最多解码最多两个连续的块,其中可能包含一些KiB未压缩的数据,用于收集足够的数据来解压缩(填充整个32 KiB窗口)。因此,即使没有索引表,随机访问也是可能的。
- BZIP2实际上是一种BWT类压缩算法。由于BWT的性质,难怪它是分块的。对于每个块,它的块限制为900 KiB。此外,块边界被很好地定义,以便于恢复过程(有巨大的不同标记)。因此,您甚至可以同时使用多个线程来解压缩所有数据。换句话说,即使没有任何表(格式已经支持它),随机访问也是非常可能的。
- LZMA支持最多一个GiB字典,而且它不是按块编码的.它使用范围编码器来编码概率,而不是赫夫曼编码器。即使考虑到64 MiB窗口大小(非常常见的值),由于范围编码器的性质,我们不能简单地解码在给定的随机点,直到填满整个窗口。此外,LZMA的状态机也可能是麻烦的。所以,它的实现是相当困难的,甚至不可能的。
也许LZMA2或PPM方法可以用于这类使用(7-zip支持,以及7-zip格式)。当它的统计数据满时,PPM刷新它的模型,并且LZMA2有意在某个时间间隔刷新一些状态,以启用多线程解压缩。它们的随机访问实现是可能的。