【问题标题】:How to efficiently transfer remotely millions of files如何有效地远程传输数百万个文件
【发布时间】:2012-03-24 22:45:00
【问题描述】:

在某些机器中,几乎有五百万个小 (50KB) 文本文件。我需要将它们发送到我们局域网上的另一台机器上。我试过做

scp *.txt remote_machine:

因为 ssh 连接是在它们之间设置无密码的。但是每个文件都要建立一个新的连接,所以速度非常慢。

因此,我想知道这样做的最佳策略是什么。

【问题讨论】:

  • 该命令不会为每个文件建立连接。由于 scp 协议内部,它变得很慢:它太健谈了。

标签: ssh file-transfer scp


【解决方案1】:

不确定 scp 是否是多线程的。如果不尝试这样的事情,那么更好地利用所有核心/ CPU 和网络带宽:

scp [A-M]*.txt remote_machine:
scp [M-Z]*.txt remote_machine:
scp [0-9]*.txt remote_machine:
...

当然,要使用的模式取决于文件的命名。

您也可以使用 rsync 以相同的方法代替 scp。

【讨论】:

  • 我认为你的方法是所有答案中最简单、最简单、最有效的方法(其他方法也是非常好的选择)
【解决方案2】:

.tar.gz 文件放在一起,un.tar.gz 文件分开在另一端。

tar cz *.txt | ssh remote_machine 'tar xz'

SSH 本身会减慢速度。如果您在同一网络上的主机之间进行复制并且安全不是问题,那么使用原始 tcp 连接可能会更好。

remote_machine$ nc -l 3333 -q 1 | tar xz
local_machine$ tar cz *.txt >/dev/tcp/remote_machine/3333

如果您想使用与 3333 不同的端口号,请确保在两行中都进行更改。

【讨论】:

    【解决方案3】:

    好吧 ssh 也意味着加密/解密,为什么不使用 ftp 而不是传输...如果安全不是真正的问题?

    此外,如果您的网络速度较慢,您可以将数据存档并在传输后解压缩。

    所以简而言之,发出以下命令来制作存档..

    cd /path/to/transfer/folder
    tar -cvpjf /tmp/transfer.tar.bz2 .
    

    要转移你会发出命令

    ftp open remotemachine
    put /tmp/transfer.tar.bz2
    

    在接收时,您将在您想要发出所有命令的文件夹中发出命令...

    cd /path/where/to/extract
    tar -xvpjf ~/transfer.tar.bz2
    rm ~/transfer.tar.bz2
    

    当然你可以自动化它,我自动化了这个过程,以便我将大量数据传输到目标......

    【讨论】:

      【解决方案4】:

      您可以在传输前创建一个files.tar.gz 文件。

      【讨论】:

      • 也可以使用 bzip2 或 lzma。
      • 我还发现bzip2可以并行运行!
      • 实际上,您可以并行运行所有内容:tar cf - $DIR | lzma -9 -c|ssh $HOST 'lzcat | tar xf -'
      猜你喜欢
      • 2020-06-02
      • 1970-01-01
      • 2021-06-14
      • 2016-08-22
      • 1970-01-01
      • 2016-10-13
      • 1970-01-01
      • 2016-04-26
      • 1970-01-01
      相关资源
      最近更新 更多