【问题标题】:WGET - Simultaneous connections are SLOWWGET - 同时连接很慢
【发布时间】:2017-07-21 01:48:51
【问题描述】:

我使用以下命令将浏览器的响应从 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 Rate-Limiting如下:

每分钟的请求数100

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

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

【问题讨论】:

    标签: multithreading bash shell wget xargs


    【解决方案1】:

    您尝试过 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
    

    【讨论】:

    • 已投票,因为它实现了 OP 的目标,但最好解释一下为什么原来的方法被破坏了。
    • 当我运行您的命令@MarkSetchell 时,它开始解析在每行末尾添加%0D 的URL。这就是为什么我使用| tr -d '\r' | 来去除任何回车。当我将| tr -d '\r' | 应用于您的命令时,我收到以下响应:wget: missing URL: No such file or directory:8888/data/test.php?isin= ABC123456789。如何正确删除所有%0D
    • 请再看看。
    • 它工作正常@MarkSetchell。我认为 API 限制避免了更快的解析,因为我获得了相同的结果。它在开始时快速启动,然后在某些时候停止下载。当我使用我在之前运行中成功提取的参数直接访问链接时,浏览器返回一个空响应,这不应该是这种情况。请注意,我在终端同时下载时执行此操作。这也对我有用cat /Applications/MAMP/htdocs/data/urls.txt | tr -d '\r' | parallel -j 8 wget {} -O - &gt; /Applications/MAMP/htdocs/data/export.txt。非常感谢!
    【解决方案2】:

    一些事情:

    • 我认为您不需要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 download with multiple simultaneous connections 了解执行相同操作的替代方法,包括 GNU parallel 和一些专用的多线程 HTTP 客户端。

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

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

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

    【讨论】:

    • 嗨@slim。实际上,我正在解析相同链接的列表,这意味着我使用不同的参数集定位同一个文件。一个例子是localhost:8888/data/test.php?value=ABC123456789。见我之前的question
    • 这并没有改变我的回答。
    • 我说是因为您的声明从多个服务器获取。我运行您的命令cat /Applications/MAMP/htdocs/data/urls.txt | tr -d '\r' | xargs -P 10 -n 100 wget -O - &gt;&gt; /Applications/MAMP/htdocs/data/export.txt,其中tr 用于去除任何回车,在这种情况下为%0D。它会运行 URL,但仍会跳过其中的一些。我知道这一点,因为我的第一次成功提取包括所有 9999 个文件,并且开始出现“空”的 URL 不应该是空的。我在我的数据库中检查这些。我用一些 API 细节更新了我的问题。
    猜你喜欢
    • 2010-09-10
    • 2021-10-27
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    相关资源
    最近更新 更多