4

存在提供对 gzip 和 bzip2 档案的随机访问的工具:

我正在为 7zip 寻找任何类似的解决方案

(目标是离线使用有时巨大的 Wikipedia 转储文件,而无需保留解压缩的副本)

4

2 回答 2

6

我认为最好总结一下 GZIP、BZIP2 和 LZMA 的内部结构以明确一些事情:

  1. GZIP 实际上是一种使用 Deflate 算法的格式。由于静态霍夫曼代码(deflate 文档也提到了动态霍夫曼,但实际上它们也是静态的)deflate 应该被编码为块状(滑动窗口是这里的另一个术语)。zran.c 似乎找到了这些块的边界,并尝试最多解码 2 个连续的块,这些块可能包含一些 KiB 未压缩数据,以收集足够的数据进行解压缩(以填充整个 32 KiB 窗口)。因此,即使没有索引表,随机访问也是很有可能的。

  2. BZIP2 实际上是一种 BWT 类压缩算法。由于 BWT 的性质,难怪它是分块的。每个单独块的块限制为 900 KiB。此外,块边界被很好地定义为易于恢复过程(具有巨大的不同标记)。因此,您甚至可以一次使用多个线程来解压缩所有数据。换句话说,即使没有任何表格(它已经被格式支持),随机访问也很有可能。

  3. LZMA 最多支持 1 GiB 字典,并且它不是按块编码的。它使用范围编码器来编码概率而不是霍夫曼编码器。即使考虑到 64 MiB 的窗口大小(非常常见的值),由于范围编码器的性质,我们不能简单地在给定的随机点解码,直到填满整个窗口。此外,LZMA 的状态机也很麻烦。所以,它的实现是相当困难的,甚至是不可能的。

也许 LZMA2 或 PPM 方法可用于此类用途(7-zip 也支持它们以及 7-zip 格式)。PPM 在其统计信息已满时刷新其模型,并且 LZMA2 有意在某个时间间隔刷新某些状态以启用多线程解压缩。他们的随机访问实现是可能的。

于 2011-12-24T23:44:18.210 回答
5

我的lzopfs项目允许随机访问 lzop、gzip、bzip2 和 xz 文件。XZ 文件是 LZMA 编码的,所以希望它可以替代 7-zip 来满足您的目的。请注意,对于实际的随机访问,您需要使用阻塞的编码器创建您的 xz 存档,例如pixz或 xz-utils 5.1.x alpha 的多线程模式。

于 2014-05-04T15:46:03.510 回答