我正在通过wget检索大量数据,使用以下命令:
wget --save-cookies ~/.urs_cookies --load-cookies ~/.urs_cookies --keep-session-cookies --content-disposition -i links.dat
我的问题是links.dat包含数千个链接。文件相对较小(100kb)。因此下载文件需要0.2秒,等待HTTP请求响应需要5秒。因此,最终花费14h来下载我的整个数据,大部分时间都在等待请求。
URL transformed to HTTPS due to an HSTS policy
--2017-02-15 18:01:37-- https://goldsmr4.gesdisc.eosdis.nasa.gov/daac-bin/OTF/HTTP_services.cgi?FILENAME=%2Fdata%2FMERRA2%2FM2I1NXASM.5.12.4%2F1980%2F01%2FMERRA2_100.inst1_2d_asm_Nx.19800102.nc4&FORMAT=bmM0Lw&BBOX=43%2C1.5%2C45%2C3.5&LABEL=MERRA2_100.inst1_2d_asm_Nx.19800102.SUB.nc4&FLAGS=&SHORTNAME=M2I1NXASM&SERVICE=SUBSET_MERRA2&LAYERS=&VERSION=1.02&VARIABLES=t10m%2Ct2m%2Cu50m%2Cv50m
Connecting to goldsmr4.gesdisc.eosdis.nasa.gov (goldsmr4.gesdisc.eosdis.nasa.gov)|198.118.197.95|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 50223 (49K) [application/octet-stream]
Saving to: ‘MERRA2_100.inst1_2d_asm_Nx.19800102.SUB.nc4.1’
这可能是一个非常荒谬的问题,但这种做法似乎非常有效。我对幕后发生的事情知之甚少,但我只是想确定我没有做错任何事情,而且这个过程确实可以更快。
如果细节有帮助,我正在为特定节点下载MERRA-2数据。
谢谢!
答案 0 :(得分:1)
Wget将重复使用现有连接来对同一服务器发出多个请求,这可能会节省建立和拆除套接字所需的时间。
您可以通过在命令行上提供多个URL来执行此操作。例如,每批下载100个:
#!/usr/bin/env bash
wget_opts=(
--save-cookies ~/.urs_cookies
--load-cookies ~/.urs_cookies
--keep-session-cookies
--content-disposition
)
manyurls=()
while read url; do
manyurls+=( "$url" )
if [ ${#manyurls[@]} -eq 100 ]; then
wget "${wget_opts[@]}" "${manyurls[@]}"
manyurls=()
fi
done < links.dat
if [ ${#manyurls[@]} -gt 0 ]; then
wget "${wget_opts[@]}" "${manyurls[@]}"
fi
请注意,我还没有对此进行过测试。它可能会奏效。如果没有,请告诉我您的错误,我会尝试调试。
所以...那个&#34;连接重用&#34;或&#34; keepalive&#34;。另一个可以加快下载速度的是HTTP Pipelining,它基本上允许在收到第一个响应之前发送第二个请求。 wget
不支持此功能,curl
在其库中支持它,但不支持命令行工具。
我没有现成的工具来建议支持HTTP流水线操作。 (除此之外,工具建议偏离主题。)您可以在this SO answer中查看管道传输的工作原理。如果您想用您所选择的语言编写支持libcurl的语言,我确定您遇到的任何困难都会使另一个有趣的附加StackOverflow问题。