- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
正如某些 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/
我将多个文件解压缩到一个文件夹中,如下所示: gunzip -f -k *.gz 一些 .gz 文件已损坏,导致命令中止。 什么是解压缩所有文件同时忽略损坏文件的好方法? 最佳答案 原始答案给出了一个
一个 API 返回大量结果集,我希望我可以用 PHP 压缩它,但我不知道如何用 Javascript 压缩它。在 Javascript 中是否有某种库能够做到这一点?我在网上搜索并找到了一些东西,但不
这是我的代码的最新版本。感谢您的 zpipe.c,它现在适用于我所有的 gunzipped 文件,无论它们的大小如何。但是我不明白的是,在内部循环中 printf("%s", out) 仍然打印相同的
对于 node.js 和异步处理方式来说相对较新,到目前为止,我已经能够使用 Promise 来使用 fs readFile 来读取文件,但我还没有让 zlib Gunzip 工作。用 Coffees
背景 我正在使用那些硬盘分区的 mysql 服务器: ... /dev/vdd 99G 58G 39G 61% /var/lib/mysql tmpfs 2
我需要在 Windows 的终端中使用 gunzip(这是 gzip 的解压工具) 我已经从 here 下载了 gzip (第一个下载链接) 我安装了它并添加了它的 /bin文件夹到我的 PATH变量
我在一个磁盘空间有限的共享服务器上,并且我有一个 gz 文件,它可以 super 扩展为一个巨大的文件,比我拥有的还要多。我怎样才能“部分”地提取它(假设一次 10 MB),并处理每个部分,甚至暂时不
我有一个 Perl 项目(CGI 脚本,在 Apache 上运行),它以前一直使用 gunzip 和 tac(将 gunzip 管道传输到 tac,然后将其管道传输到文件句柄)以完成其工作负载,即处理
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我只是在测试 Node.js 的 ZLIB,但很快就会遇到奇怪的结果。这是我的脚本(灵感来自 Node.js 手册示例 http://nodejs.org/api/zlib.html#zlib_exa
我正在开发一个程序,该程序从 curl 函数读取 header 并搜索特定 header ,如果找到,则压缩内容部分并在内容中搜索另一个字符串。我需要实现最后一部分。休息完成了。有没有办法从 C++
我正在尝试创建一个 R API for StackOverflow .输出被压缩。例如: readLines("http://api.stackoverflow.com/0.9/stats/", wa
the task 的文档说它有一个即时版本。 在我的例子中,这会导致 NullPointerException: >ant download Java HotSpot(TM) 64-Bit Serv
我已经为我的数据库恢复自动化创建了一个 bash 脚本。当我运行以下命令时,我得到/my/sql/file/path.sql: No such file or directory。 ssh $USER
我在发送到服务器的文件的 .gz 文件中遇到 crc 错误/长度错误。 在手动检索文件时,我得到的文件大小为 1932 字节,并且 gunzips 正常,没有任何问题。 但是当我通过 shell 脚本
在使用 twistedmatrix ProxyClient 时,我如何压缩和处理响应部分? 我需要检查文本或 javascript 和 ajax 查询/答案。我应该使用 handleResponseE
我有大量的 HTTP POST 请求被发送到 nginx 服务器,然后负载平衡到一组反向代理的 node.js/express.js 后端服务器。为了节省一些网络消耗,使用 GZIP 和 header
我正在尝试,只是为了好玩,将 gzip Writer 直接连接到 gzip Reader,这样我就可以动态地写入 Writer 并从 Reader 读取。我希望能准确阅读我写的内容。我正在使用 gzi
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
正如某些 StackOverflow 答案所示,您可以使用 decompressedSize = gzipFile.seek(0, io.SEEK_END) 获得确切的 gzip 解压缩文件大小。 .
我是一名优秀的程序员,十分优秀!