Linux 上的 Tar 和 7z 压缩 - 有什么区别?

Linux 上的 Tar 和 7z 压缩 - 有什么区别?

我有个问题!我有一个用 Python 编写的备份脚本。它将 /var/www/ 中的所有文件夹备份到不同的 .tar.7z 文件中,每个文件都对应一个文件夹

问题是压缩速度非常慢。对于 4GB 的大文件夹,压缩有时会在 1G 时停止,有时在 1.5GB 时停止。

这是此次压缩的行:

os.system("tar cf - -C %s . 2>/dev/null 3>/dev/null | 7za a -p%s -si %s 1>/dev/null 2>/dev/null 3>/dev/null" % (cf, self.config.get(jn, "archpass"), filename))

当我尝试tar -cf compress-dir.tar /var/www/bigsite.com/4GB 文件夹时,它会在几分钟内极其快速地运行并创建 .tar。

然而,在 python 脚本中,在开始生成 .tar 时创建的临时文件的大小增加非常缓慢。大约 10 分钟后,它达到约 1GB... 很快它就停止增加,控制台中没有显示任何错误。

有没有办法可以模拟这里发生的相同情况:tar cf - -C %s . 2>/dev/null 3>/dev/null直接在 bash 中?因为显然它不一样,因为tar -cf compress-dir.tar /var/www/bigsite.com/它运行速度要快得多。

也许如果我直接在 bash 中运行 tar,可能会出现错误。当然,如果您有其他想法,请告诉我。

答案1

Tar 本身不进行压缩。这意味着吞吐量几乎完全受 IO 能力的限制。硬盘可以轻松处理 100MB/s,因此 4GB R/W 应该可以在 80 秒左右完成 - 4GB 读取和 4GB 写入。SSD 每秒可以处理数百兆字节甚至更多。

但是 7z 确实可以进行压缩。压缩基本上是受 CPU 限制的,而不是受存储限制的。

要对 7z 进行基准测试,您可以运行7z b。在我用来写这篇文章的笔记本电脑上,7z 可以处理 20MB/s。我的 NVMe 存储可以处理 2GB/s。这是两个数量级的差异!压缩 4GB 需要 200 秒;简单地将其塞入 tarball 应该只需要 2 秒!

各种压缩算法都有不同的权衡。7z 可以配置为使用不同程度的压缩,分为 10 个步骤。

您应该尝试不同的级别来找到适合您的应用程序的正确的速度-尺寸权衡。

有没有办法可以模拟这里发生的相同情况:tar cf - -C %s . 2>/dev/null 3>/dev/null直接在 bash 中?因为它显然与 tar -cf compress-dir.tar /var/www/bigsite.com/ 不同,因为它运行速度更快。

当然,这是一个 shell 命令。os.system()只需运行指定的命令。您示例中的 tar 命令添加%s到 tarball 并将结果输出到stdout。在您提供的完整示例中,它通过管道传输到 7z。

但正如我上面所说:不是 tar 慢,而是 7z。

相关内容