对于大文件,先压缩然后传输还是 rsync -z?哪个最快?

对于大文件,先压缩然后传输还是 rsync -z?哪个最快?

我有大量相对较小的数据文件,但它们占用了大约 50 GB,我需要将它们传输到另一台机器上。我试图想出最有效的方法来做到这一点。

我的想法是先对整个文件进行 gzip 压缩,然后 rsync 并解压,依靠 rsync -z 进行压缩,然后使用 gzip 压缩,最后使用 rsync -z。我不确定哪种方法最有效,因为我不确定 rsync -z 的具体实现方式。有没有什么想法,哪种方法最快?

答案1

您无法“对整个文件进行 gzip 压缩”,因为 gzip 只能压缩一个文件,您可以创建一个 tar 文件并使用 gzip 压缩它来“对整个文件进行 gzip 压缩”,但您会失去 rsync 仅复制已修改文件的功能。

所以问题是:将我需要 rsync 的文件以 gzip 格式保存起来还是依靠 rsync 的 -z 选项更好。
答案可能是您不想在服务器上解压文件?我想是的,所以我不明白如何在执行 rsync 之前设法对文件进行 gzip 压缩。

也许您不需要 rsync 的仅复制已修改文件的功能?在这种情况下,为什么要使用 rsync 而不是对包含您内容的 tar.gz 文件进行 scp?

无论如何,回答这个问题,rsync gzip 的效率会比使用 gzip 压缩文件略低。为什么?因为 rsync 会逐块压缩数据,因此将使用较小的数据集来创建 gzip 用于压缩的表,而较大的数据集(gzip 会一次使用整个文件)会提供更好的压缩表。但在大多数情况下,差异会非常小,但在极少数情况下,差异可能更为重要(如果您有一个非常大的文件,并且文件中的模式非常长,重复多次,但彼此相距甚远)(这是一个非常简化的示例)

答案2

@radius,关于gzip工作原理的一个小问题 -gzip是一种基于块的压缩算法,而且是一种相当简单的算法。压缩表不考虑整个文件 - 只考虑每个块。其他算法可能使用文件的全部内容,还有一些算法使用多个块的内容,甚至是大小可变的块的内容。一个有趣的例子是lrzip,与 是同一作者rsync

gzip算法的精髓

因此,总而言之,使用rsync -z可能会产生相同的首先进行压缩gzip- 如果您正在进行差异传输,那么由于rsync差异算法,效果会更好。

话虽如此,我认为人们会发现常规scp算法轻松击败rsync非差异传输 - 因为它的开销远远小于rsync算法(scp无论如何它都会在底层使用!)

如果您的网络成为瓶颈,那么您就需要在网络上使用压缩。

如果你的磁盘是瓶颈,这时将数据流传输到压缩文件会是最好的选择。(例如,netcat从一台机器到另一台机器,将数据流传输到gzip -c

通常,如果速度是关键,那么预先压缩现有文件是浪费的。

TIMTOWTDI、YMMV、IANAL 等。

答案3

如果您只复制一次数据,那么 rsync 本身并不是一个很大的优势。如果您喜欢 gzip(或 tar+gzip,因为您有很多文件),您可以尝试以下方法:

tar -cz /home/me/source/directory | ssh target tar -xz --directory /home/you/target/directory

这将获得您想要的压缩,并且直接复制而不涉及 rsync。

答案4

由于压缩文件的 scp 和 rsync 所需的传输时间非常相似,因此“最有效的方法”是即时压缩而不是压缩、传输。

除了“牢固性”之外,其他考虑因素包括:

如果文件没有全部传输完毕,可以轻松重新启动 rsync。

rsync 可用于维护远程机器上的文件。

本地 tar 或 gzip 需要本地空间。

目标机器和防火墙的端口使用注意事项:1)scp 使用端口 22(默认),这可能不可接受。2)rsync 使用端口 873(默认)

我不确定为什么 radius 认为原始海报不想存储解压的文件。

相关内容