在强大的集群上以最快的方式压缩(即存档为单个文件)数百万个小文件,以加快文件传输速度

在强大的集群上以最快的方式压缩(即存档为单个文件)数百万个小文件,以加快文件传输速度

重要的提示:压缩不是目标,归档/录音(将所有文件打包成一个档案)才是目标。

我想备份一个目录,其中包含数百个子目录和数百万个小文件(<800 KB)。当我将rsync这些文件从一台机器复制到另一台远程机器时,我注意到传输速度非常低,只有大约 1 MB/秒,而当我复制大型文件(例如 500 GB)时,传输速率实际上约为 120 MB/秒。因此网络连接根本不是问题。

在这种情况下,仅移动 200 GB 的小文件就花了我大约 40 个小时。因此,我考虑压缩包含这些文件的整个目录,然后将压缩的存档传输到远程计算机,然后在远程计算机上解压缩。我并不指望这种方法能将 40 小时缩短到 5 小时,但我怀疑它肯定会花费不到 40 小时。

我可以访问14 个 CPU 核心(56 个线程 - Intel(R) Xeon(R) Gold 5120 CPU @ 2.20GHz)和 128 GB RAM。因此,CPU/RAM 功率不是问题。

但是,从这么多文件中创建单个档案的最快和最有效的方法是什么?我目前只知道这些方法:

但是,我不知道哪个更快,以及如何调整参数才能达到最大速度?(例如,使用 7zip 时最好使用所有 CPU 核心还是只使用一个?)

注意:文件大小和压缩率没有关系一点也不。我根本不想节省空间。我只是想用这么多文件创建一个档案,这样传输速率就会是 120 MB/s,而不是 1 MB/s。

有关的如何让 7-Zip 运行得更快

答案1

使用tar,但放弃 gzip 部分。TAR 的整个目的是将文件转换为单个流(它代表磁带存档)。根据您的流程,您可以将流写入磁盘并复制,但更高效的是,您可以将其通过管道(例如通过 SSH)传输到另一台机器 - 可能同时解压缩它。

因为该过程是 IO 密集型而非 CPU 密集型,所以并行化该过程不会有太大帮助,甚至根本没有帮助。您将减少文件传输大小(如果文件不能被块大小精确整除),并且您将节省很多无需来回协商每个文件。

要创建未压缩的 tar 文件:

tar -cf file.name /path/to/files

要通过网络进行流式传输:

tar -c /path/to/files | ssh [email protected] 'cd /dest/dir && tar -x'

注意:如果按照示例 1 将中间文件写入硬盘,如果压缩程度足够高,使用 gzip 压缩文件实际上可能会更快,因为它会减少要写入磁盘的数据量,而这正是该过程的缓慢部分。

相关内容