读取 ("tailing") 一个巨大的 (>300GB) gzip 文本文件的结尾

Reading ("tailing") the end of a huge (>300GB) gzipped text file

我有一个文本文件,原来大小超过 300GB,gzipped 后仍然有超过 10GB。 (这是一个数据库导出 运行 几天,然后被中止,我想知道最后一个导出条目的时间戳,以便我可以恢复导出。)

我对这个文本文件的最后几行感兴趣,最好不必解压整个 300GB(甚至放入内存)。此文件不再增长,因此我不需要跟踪更改或附加数据 a.k.a tail -f.

有没有办法只压缩文件的最后一部分?

tail --bytes=10000000 /mnt/myfile.db.gz | gunzip - |less

不起作用(它 returns stdin: not in gzip format)。由于 gzip 不仅可以压缩文件,还可以压缩数据流,因此应该可以在文件中某处搜索开始解压缩的入口点,而无需读取文件头。对吗?

不,不对。除非专门生成 gzip 流以允许随机访问,否则解码最后几行的唯一方法是解码整个内容。

关于我自己的问题的快速跟进:如果没有 hackery,使用 gzip 是不可能的(gzip 有补丁,可以块压缩,您可以独立解码每个块)。

BUT 您可以使用 xz,并且使用最低压缩率 (-0) CPU 负载与 gzip 和压缩。而且 xz 实际上可以解压缩压缩文件的一部分。

以后会考虑的。