如何在不读取其全部内容的情况下拖尾压缩文件?

时间:2009-07-25 20:40:00

标签: algorithm compression

我想模仿gzcat的功能尾巴-n。

这对于有大量文件(几GB左右)的时候会有所帮助。我可以从头开始读取这样一个文件的最后几行吗?我怀疑这是不可能的,因为我猜gzip,编码将取决于所有以前的文本。

但是我仍然想听听是否有人尝试过类似的事情 - 可能会调查可以提供这种功能的压缩算法。

7 个答案:

答案 0 :(得分:39)

不,你不能。 zipping algorithm适用于流,并将其内部编码调整为流所包含的内容,以实现其高压缩比。

在某个点之前不知道流的内容是什么,就不可能知道如何从那一点开始解压缩。

任何允许您对其任意部分进行解压缩的算法都需要对数据进行多次传递才能对其进行压缩。

答案 1 :(得分:7)

BGZF用于创建由Samtools创建的索引gzip压缩BAM文件。这些是随机可访问的。

http://samtools.sourceforge.net/

答案 2 :(得分:3)

如果你可以控制首先进入文件的内容,如果它像ZIP文件一样你可以存储预定大小的块,文件名按数字顺序递增,然后只解压缩最后一个块/文件。

答案 3 :(得分:1)

如果它是一个选项,那么bzip2可能是一个更好的压缩算法,可用于此目的。

Bzip2使用块压缩方案。因此,如果您获取文件末尾的一大块,您确定它足够大以包含所有最后一个块,那么您可以使用bzip2recover恢复它。

在写入文件时可以选择块大小。事实上,当您将-1(或--fast)设置为-9(或--best)作为压缩选项时会发生什么,这对应于100k到900k的块大小。默认值为900k。

bzip2命令行工具不能通过管道为您提供友好的友好方式,但是由于bzip2不是面向流的,所以这并不奇怪。

答案 4 :(得分:1)

zindex以节省时间和空间的方式在压缩的基于行的文本文件上创建和查询索引。

https://github.com/mattgodbolt/zindex

答案 5 :(得分:0)

dictzip是完全与gzip兼容的伪随机访问格式的示例:

  

为了进行压缩,该文件分为“大块”数据,每个大块   块小于64kB。 [...]

     

要对数据执行随机访问,则偏移量和长度   数据提供给库例程。这些例程确定   所需数据开始的块,然后对该块进行解压缩。   连续的块将根据需要解压缩。”

答案 6 :(得分:0)

好吧,如果您先前为每个文件创建了 index ,则可以执行此操作...

我已经开发了一个命令行工具,该工具为gzip文件创建索引,从而可以在它们内部进行非常快速的随机访问https://github.com/circulosmeos/gztool