WGET - 同时连接缓慢

时间:2017-07-20 14:27:08

标签: multithreading bash shell wget xargs

我使用以下命令将浏览器的URL响应附加到相应的输出文件中:

wget -i /Applications/MAMP/htdocs/data/urls.txt -O - \
     >> /Applications/MAMP/htdocs/data/export.txt

这很好用,完成后说:

Total wall clock time: 1h 49m 32s
Downloaded: 9999 files, 3.5M in 0.3s (28.5 MB/s)

为了提高速度,我使用了:

cat /Applications/MAMP/htdocs/data/urls.txt | \
   tr -d '\r' | \
   xargs -P 10 $(which wget) -i - -O - \
   >> /Applications/MAMP/htdocs/data/export.txt

这会打开同步连接,使其更快一点:

Total wall clock time: 1h 40m 10s
Downloaded: 3943 files, 8.5M in 0.3s (28.5 MB/s)

正如您所看到的,它以某种方式省略了超过一半的文件并且大约需要。同时完成。我无法猜到为什么。我想在这里做的是使用xargs一次下载10个文件(并行处理),并在‘STDOUT’完成后跳转到下一个URL。我错过了什么,或者可以做到这一点吗?

另一方面,有人可以告诉我可以设置的关于连接的限制是什么?知道我的处理器可以处理多少连接而不会过度减慢我的系统,甚至避免某种类型的 SYSTEM FAILURE 真的很有帮助。

我的 API速率限制如下:

每分钟的请求数 100

单个请求中的映射作业数 100

每分钟的映射作业总数 10,000

2 个答案:

答案 0 :(得分:3)

您是否尝试过 GNU Parallel ?它将是这样的:

parallel -a /Applications/MAMP/htdocs/data/urls.txt wget -O - > result.txt

您可以使用它来查看它将在没有实际执行任何操作的情况下执行的操作:

parallel --dry-run ...

其中任何一项都可以看到进展:

parallel --progress ...
parallel --bar ...

由于您的输入文件似乎有点混乱,您可以像这样删除回车:

tr -d '\r' < /Applications/MAMP/htdocs/data/urls.txt | parallel wget {} -O - > result.txt

答案 1 :(得分:1)

一些事情:

  • 我认为你不需要tr,除非你的输入文件有些奇怪。 xargs每行需要一个项目。
  • man xargs建议您“-n使用-P;否则 很有可能只会有一名执行官。“
  • 您正在使用wget -i -告诉wget从stdin读取网址。但xargs会将网址作为参数提供给wget
  • 要进行调试,请将echo替换为wget并检查它如何批量处理参数

所以这应该有效:

 cat urls.txt | \
 xargs --max-procs=10 --max-args=100 wget --output-document=- 

(我更喜欢长参数 - --max-procs-P--max-args-n

有关执行相同操作的其他方法,请参阅wget download with multiple simultaneous connections,包括GNU parallel和一些专用的多线程HTTP客户端。

但是,在大多数情况下,我不希望并行化显着提高您的下载速度。

在典型的用例中,瓶颈很可能是您与服务器的网络链接。在单线程下载期间,您可能希望在该路由中使最慢的链接饱和。使用两个线程可能会获得非常小的收益,因为一个线程可以下载而另一个线程正在发送请求。但这将是一个微不足道的收获。

因此,如果您从多个服务器获取此方法,这种方法可能是值得的,并且到某些服务器的路由中最慢的链接不在客户端。