gpt4 book ai didi

python - 以与 gunzip 一样快的速度获取 gzip 压缩文件大小(无搜索)

转载 作者:行者123 更新时间:2023-12-04 14:39:08 24 4
gpt4 key购买 nike

正如某些 StackOverflow 答案所示,您可以使用 decompressedSize = gzipFile.seek(0, io.SEEK_END) 获得确切的 gzip 解压缩文件大小。 .有些人还建议小于 4 GiB 的文件做 .seek(-4, 1) .然而,因为它一直在文件中寻找直到最后,所以对于更大的文件来说非常耗时(对于大约 1 GiB 的解压缩数据,寻找到最后需要几秒钟的时间)。
然后我尝试使用 gunzip -l somefile.gz (同一文件),它设法立即输出当前文件大小以及解压缩时的文件大小。
我如何能够像 gunzip 一样快地获得解压 gzip 的文件大小如果不是更快?
(P.S. 我尝试获取解压后的 gzip 大小的原因是解压时的 CLI 进度条)

最佳答案

gzip -l实际上是在寻找并读取文件的最后四个字节。您的评论“因为它一直在文件中查找直到最后,对于更大的文件来说非常耗时”表明您不了解什么是查找。寻找不是在你读到最后之前阅读整个文件。寻找是将文件的读取指针移动到所需的点,并从那里读取。它需要 O(1) 时间,而不是 O(n) 时间(其中 n 是文件的大小)。 @crissal 的回答显示了如何正确执行此操作。
最后四个字节是最后一个 gzip 成员的未压缩长度,模 232,假设 gzip 文件末尾没有垃圾。
您会注意到该句子中的三个警告。首先,正如您已经注意到的,未压缩的大小需要小于 232 字节才能使该数字有意义。但是,您不一定可以通过查看压缩文件来判断这是否属实。 gzip 可以压缩到 1024 倍以上,因此 gzip 文件的长度可能只有 222 个字节,4 MB,但解压缩到 4 GB 以上。
第二个警告是 gzip 文件必须只有一个成员。 gzip 格式允许连接 gzip 成员,最后四个字节仅代表最后一个成员的长度。除了解码整个 gzip 文件之外,没有可靠的方法可以找到其他成员。
第三个警告是 gzip 文件最后没有任何垃圾。一般来说,我还没有在野外看到这种情况,但是 gzip 文件的末尾可能会有填充,这会再次混淆查找长度。
底线:如果可靠地确定压缩大小对您很重要,那么只有在您控制 gzip 文件的生成时才可以使用最后四个字节,并且您可以确保内容小于 4 GB,只有一个成员,最后没有垃圾。
对于您的应用程序,您不需要知道未压缩数据的长度。相反,您应该将进度条基于迄今为止处理的压缩数据的比例。您知道文件系统中文件的压缩大小,并且您知道到目前为止您已经消耗了多少压缩数据。如果数据近似均匀,则压缩比将在整个减压过程中近似恒定。对于恒定的压缩率,压缩数据进度条将显示与未压缩数据进度条完全相同的内容。

关于python - 以与 gunzip 一样快的速度获取 gzip 压缩文件大小(无搜索),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69351289/

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