优化许多html文件的下载

时间:2012-07-25 20:37:58

标签: .net performance optimization

我有大约一百万个网址指向我要保存到我的磁盘的公共网络服务器上的HTML页面。它们中的每一个大小相同,约为30千字节。我的网址列表在磁盘上的20个文件夹中均匀分割,因此为了简单起见,我为每个文件夹创建一个Task,并在每个任务中按顺序下载一个URL。所以这给了我任何时候大约20个并行请求。我是一个相对蹩脚的DSL,5mbps连接。

这代表几千兆字节的数据,所以我预计这个过程需要几个小时,但我想知道我是否可以让这个方法更有效率。我是否可能充分利用我的联系?我该如何衡量呢? 20个并行下载是一个很好的数字还是我应该拨号上下?

语言是F#,我正在为每个网址使用WebClient.DownloadFile,每个任务使用一个WebClient。

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

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

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

这使下载量从大约32k减少到9k,从而大大节省了速度并节省了磁盘空间。感谢TerryE提到它!

2 个答案:

答案 0 :(得分:2)

如果您使用的是下载程序API,请确保它正在发布

  

接受编码:gzip,deflate

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

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

答案 1 :(得分:1)

我只会并行化,直到达到连接速度的极限。如果每个单一请求都使您的DSL连接饱和,那么并行运行它们将无法获得任何收益,并且可能会阻止您。

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

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