1

ディスクに保存したいパブリックWebサーバー上のHTMLページを指す約100万のURLがあります。これらはそれぞれほぼ同じサイズで、約30キロバイトです。私のURLリストはディスク上の20個のフォルダーにほぼ均等に分割されているため、簡単にするために、フォルダーごとに1つのタスクを作成し、各タスクでURLを順番にダウンロードします。つまり、いつでも約20の並列リクエストが得られます。私は比較的安っぽいDSL、5mbps接続を使用しています。

これは数ギガバイトのデータに相当するため、プロセスには数時間かかると予想していますが、このアプローチをさらに効率的にすることができるかどうか疑問に思っています。接続を最大限に活用している可能性がありますか?どうすればそれを測定できますか?20の並列ダウンロードは適切な番号ですか、それともダイヤルアップまたはダイヤルダウンする必要がありますか?

言語はF#です。すべてのURLにWebClient.DownloadFileを使用しており、タスクごとに1つのWebClientを使用しています。

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

編集:大きな違いをもたらした1つのことは、リクエストに特定のヘッダーを追加することでした:

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

これにより、ダウンロードのサイズが約32kから9kに削減され、速度が大幅に向上し、ディスク容量が節約されます。言及してくれたTerryEに感謝します!

4

2 に答える 2

2

ダウンローダーAPIを使用している場合は、それが発行していることを確認してください

Accept-Encoding:gzip、deflate

スクレイピングしているサイトが圧縮されたHTMLを返すことを認識できるようにヘッダーを要求します。(ほとんどのWebサーバーは、クライアントがこの要求ヘッダーを使用して、圧縮されたデータストリームを受け入れることをサーバーに通知する場合、HTMLデータストリームを圧縮するように構成されます。)

これにより、転送されるデータが約4分の1に削減されます(たとえば、このページは40Kの生のHTMLでしたが、ブラウザに転送されたのは10Kのみでした(HTMLはzip形式です)。

于 2012-07-26T13:45:40.317 に答える
1

接続速度の限界に達するまで並列化するだけです。それぞれのリクエストがDSL接続を飽和させている場合、それらを並行して実行しても何も得られず、ブロックされる可能性があります。

まず、 http: //wowrack.speedtest.netなどのツールを使用して容量を測定します。次に、スループットがこの値に達するまで並列化します。現在のネットワーク使用状況を監視するにはさまざまな方法があります。最も簡単な方法は、Windowsタスクマネージャーに移動して[ネットワーク]タブをクリックすることです。

また、サーバーへの接続を開いたままにし、リクエストごとに接続を再度開かないようにしてください。これにより、不要なオーバーヘッドが発生します。

于 2012-07-25T20:55:10.450 に答える