linux wget中的HTTP请求占用了大部分时间

3phpmpom  于 11个月前  发布在  Linux
关注(0)|答案(1)|浏览(128)

我正在通过wget检索大量数据:

wget --save-cookies ~/.urs_cookies --load-cookies ~/.urs_cookies --keep-session-cookies --content-disposition -i links.dat

字符串
links.dat包含数千个指向小文件(~ 100 kB)的链接。每个文件下载需要0.2秒,HTTP请求响应需要5秒。下载需要14小时,基本上是等待HTTP请求响应。

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的数据。

6yt4nkrj

6yt4nkrj1#

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

字符串
请注意,我还没有测试这个。它可能工作。如果它不工作,告诉我你的错误,我会尝试调试。
所以.这就是“连接重用”或“keepalive”。另一个可以加快下载速度的方法是HTTP Pipelining,它基本上允许在收到第一个响应之前发送第二个请求。wget不支持这一点,curl的库支持它,但命令行工具不支持。
我没有现成的工具来建议支持HTTP管道。(除此之外,工具建议是离题的。)你可以看到管道在this SO answer中是如何工作的。如果你想用你选择的支持libcurl的语言写一些东西,我相信你遇到的任何困难都会成为另一个有趣的额外StackOverflow问题。

相关问题