跳到内容

压缩流

压缩流模块

概览

压缩流提供了一种内置方式,可以根据几种常见文件格式来压缩和解压缩数据。

支持的格式

格式 规范
gzip RFC1952
deflate (也称为 ZLIB) RFC1950
deflate-raw RFC1951

规范

设计

压缩流的工作方式是传入一个数据块(uint8 数组),然后返回该数据块的压缩/解压缩输出。在压缩/解压缩流期间可以传入许多数据块。

在尝试压缩/解压缩数据时,速度至关重要。

在压缩流中,我们尝试预先分配足够的内存,这样我们只需执行一次压缩。对于解压缩流,我们每次尝试解压缩数据块时,都会将分配的内存增加一倍(上限为 1GB)。这种设计是为了确保所需的分配量最小化,并限制调用 inflate/deflate 的次数。

当然,随着内存使用的增加,在内存较小的设备上我们可能会达到上限。为了解决这个问题,我们实施了一种退避算法,如果内存分配开始失败,它将迅速缩减内存分配大小。

我们目前为每个数据块缓冲所有压缩/解压缩输出,并一次性将其返回给用户。我们也可以考虑在每次调用 inflate/deflate 后立即将数据块输出返回给用户的可能性。

在 Windows 和 Linux 上,我们专门使用 zlib 来执行所有压缩和解压缩算法的繁重工作。

在 Apple 平台上,我们利用 Compression Framework 进行 deflate-raw 解压缩,以获得额外的性能。其余操作使用 zlib。Compression Framework 仅支持我们用例中的 deflate-raw,目前使用此框架处理压缩相比 zlib 没有性能优势。

备注

压缩流对于 gzip 和 deflate 算法存在一个微小缺陷。这两种文件格式的末尾都包含一个校验和。这意味着您可以解压缩一个大文件,但如果在验证校验和步骤中出现任何问题,您可能无法信任任何输出。这最终是由于文件格式的设计所致,但如果出现问题,它确实不允许对任何解压缩数据进行任何实际挽救。