【问题标题】:Optimizing download of many html files优化许多html文件的下载
【发布时间】:2012-07-24 09:15:25
【问题描述】:

我有大约一百万个指向公共 Web 服务器上的 HTML 页面的 URL,我想将它们保存到我的磁盘中。每一个的大小都差不多,大约 30 KB。我的 url 列表在磁盘上的 20 个文件夹中平均分布,因此为简单起见,我为每个文件夹创建一个 Task,并且在每个任务中,我依次下载一个 URL 一个接一个。所以这随时给我大约 20 个并行请求。我在一个相对糟糕的 DSL 上,5mbps 连接。

这代表了数 GB 的数据,因此我预计该过程需要几个小时,但我想知道是否可以使该方法更有效。我是否有可能充分利用我的联系?我该如何衡量呢? 20 次并行下载是一个好数字还是我应该向上或向下拨号?

语言是 F#,我为每个 url 使用 WebClient.DownloadFile,每个任务一个 WebClient。

===================================

编辑:产生巨大差异的一件事是在请求中添加了某个标头:

let webClient = new WebClient()
webClient.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate")

这将下载大小从大约 32k 减少到了 9k,从而极大地提高了速度并节省了磁盘空间。感谢 TerryE 提及!

【问题讨论】:

  • 默认情况下,.net 每个服务器的连接限制为 2。如果您想要更多并行下载,则需要更改它。

标签: .net performance optimization


【解决方案1】:

如果您使用的是下载器 API,请确保它正在发出一个

接受编码:gzip、放气

请求标头,以便您正在抓取的站点知道返回压缩的 HTML。 (如果客户端使用此请求标头让服务器知道它将接受压缩数据流,则大多数 Web 服务器将被配置为压缩 HTML 数据流。)

这会将传输的数据减少大约 4 倍。(例如,此页面是 40K 原始 HTML,但只有 10K 传输到我的浏览器(HTML 已压缩)。

【讨论】:

    【解决方案2】:

    我只会并行化直到达到连接速度的极限。如果每个请求都使您的 DSL 连接饱和,那么并行运行它们不会为您带来任何好处,并且可能会阻止您。

    首先使用http://wowrack.speedtest.net 之类的工具衡量您的能力。然后并行化,直到您的吞吐量达到此值。有多种方法可以监控您当前的网络使用情况,最简单的方法是转到 Windows 任务管理器并点击“网络”选项卡。

    还要确保您保持与服务器的连接打开,而不是为每个请求重新打开它。这将导致不必要的开销。

    【讨论】:

    • Windows 任务管理器只给了我网络连接上的流量百分比(100Mbps),当然这是一个很小的数字。如果 WebClient.DownloadFile 每次都打开一个新连接,您是否知道?
    • 您可以尝试使用codebox.org.uk/pages/bitmeter2 之类的工具来衡量您的吞吐量。我不确定 WebClient.DownloadFile 方法是否在您的环境中保持连接打开,但您可能需要通读 pcreview.co.uk/forums/…
    • 谢谢,位计操作系统运行良好。看起来我正在使连接饱和,所以我目前的方法似乎很好。
    猜你喜欢
    • 2019-05-21
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多