![加速递归 FTP](https://linux22.com/image/35592/%E5%8A%A0%E9%80%9F%E9%80%92%E5%BD%92%20FTP.png)
我正在尝试使用 wget (或 ncftpget)从 NOAA FTP 服务器下载一年的数据。然而,由于 FTP 的开销(我认为),它花费的时间比应有的要长。例如,这个命令
time wget -nv -m ftp://ftp:[email protected]/pub/data/noaa/2015 -O /weather/noaa/2015
或者类似地,通过 ncftpget
ncftpget -R -T -v ftp.ncdc.noaa.gov /weather/noaa/ /pub/data/noaa/2015
产生的结果是. 53分钟传输30M!
FINISHED --2015-01-03 16:21:41--
Total wall clock time: 53m 32s
Downloaded: 12615 files, 30M in 7m 8s (72.6 KB/s)
real 53m32.447s
user 0m2.858s
sys 0m8.744s
当我观看此传输时,每个单独的文件传输速度相当快(500kb/秒),但下载 12,000 个相对较小的文件的过程会产生大量开销,并减慢整个过程。
我的问题:
- 我对形势的评估正确吗?我意识到在不了解服务器的情况下很难判断,但是在传输大量小文件时 FTP 真的这么糟糕吗?
- 是否对 wget 或 ncftpget 进行了任何调整,以使它们能够更好地与远程 FTP 服务器配合?或者也许是某种并行性?
答案1
以下是我最终如何利用其他人的建议解决这个问题的。在本例中,NOAA 有一个 FTP 和一个 HTTP 资源,因此我编写了一个脚本来执行以下操作:
- ncftpls 获取文件列表
- sed 完成 http 文件完整列表的文件路径
- aria2c 快速下载全部
示例脚本:
# generate file list
ncftpls ftp://path/to/ftp/resources > /tmp/remote_files.txt
# append the full path, use http
sed -i -e 's/^/http:\/\/www1\.website\.gov\/pub\/data\//' /tmp/remote_files.txt
# download using aria2c
aria2c -i /tmp/remote_files.txt -d /filestore/2015
这运行得更快,并且可能对 NOAA 的服务器更友好。甚至可能有一种聪明的方法可以摆脱中间步骤,但我还没有找到。
答案2
- 你的评价是正确的。从纯粹的数字角度来看,开销会减慢下载速度
- 使用咏叹调2c。 Aria2c 打开许多与 ftp 服务器的并行连接,以更快地下载一组文件。只需确保您的服务器支持来自同一主机的多个并发连接
或者,如果您在主机上有写访问权限(在这种情况下,我假设您是匿名登录并且没有写访问权限),请在下载之前对文件进行 zip/tar 压缩
答案3
是的,你是对的。不幸的是,虽然 ftp 规范提供了一种替代传输模式,能够通过单个数据连接管道传输多个文件,但我上次对可用软件进行调查时(诚然是在 1998 年),但没有一个支持它。我认为情况没有改变,因为人们对 ftp 的兴趣相当低。大多数拥有此类数据集的组织都通过 http 或更大的档案提供对它们的访问,以避免此问题。您应该检查 NOAA 是否这样做。