压缩流的能力如何影响压缩算法?

时间:2011-08-22 17:46:55

标签: stream compression bzip2 xz

我最近通过将其作为tar流发送并在我的末尾压缩它来备份我即将到期的大学主目录:ssh user@host "tar cf - my_dir/" | bzip2 > uni_backup.tar.bz2

这让我想到:我只知道压缩如何工作的基础知识,但我想这种压缩数据流的能力会导致压缩较差,因为算法需要在一个点完成处理数据块,将其写入输出流并继续下一个块。

是这样的吗?或者这些程序只是将大量数据读入内存压缩,写入,然后重新执行此操作?或者这些“流压缩器”中是否有任何巧妙的技巧?我看到 bzip2 xz 的手册页都讨论了内存使用情况,而 man bzip2 也暗示了这一点很少丢失将要压缩的数据砍成块:

  

较大的区块大小会使边际收益迅速减少。大多数压缩来自前两个或三百k的块大小,在小型机器上使用bzip2时要记住这一事实。同样重要的是要理解通过选择块大小来在压缩时设置解压缩存储器要求。

我仍然希望听到是否使用了其他技巧,或者我可以在哪里阅读更多相关内容。

1 个答案:

答案 0 :(得分:4)

这个问题更多地涉及缓冲区处理而不是压缩算法,尽管也可以说一下。

某些压缩算法本质上是“基于块的”,这意味着它们绝对需要使用特定大小的块。这就是bzip2的情况,由于“级别”开关,从100kb到900kb,选择了块大小。 因此,如果您将数据流入其中,它将等待块被填充,并在该块已满时开始压缩该块(或者,对于最后一个块,它将以它接收的任何大小工作)。

其他一些压缩算法可以处理流,这意味着它们可以使用保存在内存缓冲区中的较旧数据来连续压缩新数据。基于“滑动窗口”的算法可以做到这一点,通常zlib能够实现这一点。

现在,即使是“滑动窗口”压缩器也可以选择将输入数据切割成块,以便更容易地进行缓冲区管理,或者开发多线程功能,例如pigz。