WGET - 同时连接速度很慢



我使用以下命令将浏览器的响应从 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。我错过了什么还是可以这样做?

另一方面,有人可以告诉我可以设置的连接限制是什么吗?了解我的处理器可以处理多少连接而不会减慢我的系统速度,甚至避免某种类型的系统故障,这将非常有帮助。

我的API 速率限制如下:

每分钟请求数100

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

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

你试过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

几件事:

  • 我认为您不需要tr,除非您的输入文件有些奇怪。xargs期望每行一个项目。
  • man xargs建议您"将-n选项与-P一起使用;否则 很可能只有一个高管会被完成。
  • 您正在使用wget -i -告诉wget从标准输入读取URL。但是xargs将提供URL作为参数提供给wget
  • 若要调试,请将echo替换为wget,并检查它如何批处理参数

所以这应该有效:

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

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

请参阅具有多个同时连接的wget下载,了解执行相同操作的替代方法,包括GNUparallel和一些专用的多线程HTTP客户端。

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

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

因此,只有当您从多个服务器获取数据,并且到某些服务器的路由中最慢的链接不在客户端时,这种方法才可能是有价值的。

最新更新