gpt4 book ai didi

gzip - 读取 gzip 文本文件的最后几行

转载 作者:行者123 更新时间:2023-12-03 22:45:42 25 4
gpt4 key购买 nike

比方说 file.txt.gz有 2GB,我想看到最后 100 行左右。 zcat <file.txt.gz | tail -n 100会经历这一切。

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

如果我理解正确,gzip 流是一个简单的命令流,描述了要输出的内容 - 应该可以与之同步。然后是最近未压缩​​数据的 32kB 滑动窗口——当然,如果我们从中间开始,它会作为垃圾开始,但我猜它通常会很快被真实数据填满,从那时起解压是微不足道的(好吧,有可能某些内容从文件开头到结尾一遍又一遍地重新复制,因此滑动窗口永远不会清除 - 如果它如此常见,我会感到惊讶 - 如果发生这种情况,我们只会处理整个文件)。

我不是非常渴望自己做这种 gzip 黑客 - 以前没有人做过,如果没有别的,处理损坏的文件吗?

或者 - 如果 gzip 真的不能做到这一点,除了它们允许在中流重新同步之外,是否还有其他类似的流压缩程序?

编辑:我发现 pure Ruby reimplementation of zlib并破解它以在滑动窗口内打印字节的年龄。事实证明,事情确实会被一遍又一遍地复制很多,即使在 5MB+ 之后,滑动窗口仍然包含前 100 个字节的内容,以及整个文件中随机位置的内容。

我们甚至无法通过读取前几个块和最后几个块来解决这个问题,因为那些第一个字节不是直接引用的,它只是一个很长的副本链,找出它所指内容的唯一方法是通过处理这一切。

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

另一方面,zlib 有 Z_FULL_FLUSH清除此滑动窗口以进行同步的选项。所以这个问题仍然存在。假设 zlib 不时同步,是否有任何工具可以只读取它的末尾而不处理它?

最佳答案

Z_FULL_FLUSH 发出可用于同步的已知字节序列 (00 00 FF FF)。 This link可能有用。

关于gzip - 读取 gzip 文本文件的最后几行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3330921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com