2011-08-22 59 views
4

我最近备份了即将到期的大学主目录,将它作为焦油流发送并在我的末端进行压缩:ssh [email protected] "tar cf - my_dir/" | bzip2 > uni_backup.tar.bz2压缩流的能力如何影响压缩算法?

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

这是这种情况?或者,这些程序是否只是将大量数据读入内存压缩,写入,然后再重新执行一次?还是在这些“流式压缩机”中使用了巧妙的技巧?我看到,无论的bzip2XZ的手册页谈论内存使用情况,并人的bzip2也暗示一个事实,即小是失去了对砍的数据被压缩成块:

规模越大,边际收益就越快递减。大部分压缩来自块大小的前两三百k,在小型机器上使用bzip2时值得注意。认识到解压缩内存要求是在压缩时间通过选择块大小来设置也很重要。

我仍然很想听听是否使用了其他技巧,或者我可以在哪里阅读更多关于此的信息。

+2

好问题;我只想指出,通过诸如'bzip2'之类的压缩程序管道化数据流并不一定意味着实时压缩和发送小块数据。您可以轻松拥有一个压缩实用程序,该实用程序可以消除发送给它的所有数据,直到达到EOF,然后才压缩并将其发送。 –

+1

我不希望bzip2在开始写输出的第一个字节之前分析几个数据集。这可能会节省几个字节的最终大小,但我们都希望性能。但是,我也喜欢你的问题。 –

回答

4

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

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

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

现在,即使是“滑动窗口”压缩机也可能会选择将输入数据切割成块,以便于缓冲区管理,或开发多线程功能,如pigz。

+0

有趣。谢谢! – beta