2010-07-25 81 views
14

比方说file.txt.gz有2GB,我想看最后100行左右。 zcat <file.txt.gz | tail -n 100会经历所有这一切。读取gzip文本文件的最后一行

据我所知,压缩文件不能随机访问,如果我剪掉它的最后5MB,那么剪切后的数据将是垃圾 - 但可以gzip重新同步并解码流的其余部分?

如果我没有理解它正确的gzip流是描述如何输出命令的简单流 - 它应该是可能的,要同步。然后是最近一次未压缩数据的32kB滑动窗口 - 当然如果我们在中间开始的时候它会以垃圾的形式出现,但我猜测它通常会很快被真实数据填满,并且从这一点开始解压缩是微不足道的(好吧,有可能从文件开始到结束都会一遍又一遍地重复出现,因此滑动窗口永远都不会清除 - 如果这是常见的 - 如果发生这种情况,我们只处理整个文件,这会让我感到惊讶)。

我不是非常急于做这个亲属的gzip的两轮牛车自己 - 没有人这么做过,用于处理损坏的文件,如果没有别的?

或者 - 如果真的gzip的不能做到这一点,是有可能的工作非常喜欢它的任何其他流压缩程序,除非他们允许重新同步中流?

编辑:我发现pure Ruby reimplementation of zlib和砍死它内滑动窗口打印字节的青睐。事实证明,事情会被一遍又一遍地复制很多,甚至在5MB +滑动窗口仍然包含前100个字节的东西以及整个文件中的随机位置。

我们甚至无法通过读取前几个块和最后几个块来解决这个问题,因为那些第一个字节没有直接引用,它只是一个非常长的副本链,并且唯一的方法就是找出它指的是什么是通过处理这一切。

本质上,使用默认选项,我想要的可能是不可能的。

在另一方面zlib的具有Z_FULL_FLUSH选项进行同步的目的,清除了这个滑动窗口。所以问题依然存在。假设zlib每隔一段时间同步一次,是否有任何工具只是读取它的结尾而不处理它?

+0

检查出重复的问题http://stackoverflow.com/questions/14225751/random-access-to-gzipped-files和zran http://www.zlib.net/zlib_faq.html#faq28 – 2014-04-08 22:24:03

+1

这个问题真的有与我的问题无关,'Z_FULL_FLUSH'才是真正的解决方案。 – taw 2014-04-09 22:56:14

+0

酷!你能发布你的解决方案吗? – 2015-01-29 20:49:14

回答

1

Z_FULL_FLUSH发出已知的字节序列(00 00 FF FF),你可以用它来进行同步。 This link可能是有用的。

+6

链接已死亡... – stepancheg 2011-01-07 02:19:06

0

这是块和流密码的区别。由于gzip是一个流密码,因此您可能需要整个文件达到某个点才能解密该点的字节。

正如你所提到的那样,当窗口被清除时,你就是金。但是并不能保证zlib实际上对你来说足够经常这么做......我建议你从文件末尾向后寻找并找到完整刷新的标记。

相关问题