21

HttpWebResponse.GetResponse()とStreamreader.ReadToEnd()を使用してC#(数百のサイトのみ)で制限付きWebクローラーを実装しようとしています。また、StreamReader.Read()とループを使用してHTML文字列を作成しようとしています。

約5〜10Kのページのみをダウンロードしています。

それはすべて非常に遅いです!たとえば、GetResponse()の平均時間は約0.5秒ですが、StreamREader.ReadToEnd()の平均時間は約5秒です。

すべてのサイトは私の場所に非常に近く、サーバーが高速であるため、非常に高速である必要があります。(Explorerでは実質的にD / Lには何もかかりません)そして私はプロキシを使用していません。

私のクローラーには、同じサイトから同時に読み取る約20のスレッドがあります。これが問題を引き起こしている可能性がありますか?

StreamReader.ReadToEnd時間を大幅に短縮するにはどうすればよいですか?

4

9 に答える 9

16

HttpWebRequest がプロキシ設定を検出するのに時間がかかる場合があります。これをアプリケーション構成に追加してみてください:

<system.net>
  <defaultProxy enabled="false">
    <proxy/>
    <bypasslist/>
    <module/>
  </defaultProxy>
</system.net>

読み取りをバッファリングして、基盤となるオペレーティング システム ソケットに対する呼び出しの数を減らすことで、わずかなパフォーマンスの向上が見られる場合もあります。

using (BufferedStream buffer = new BufferedStream(stream))
{
  using (StreamReader reader = new StreamReader(buffer))
  {
    pageContent = reader.ReadToEnd();
  }
}
于 2009-12-23T04:30:29.177 に答える
8

WebClient の DownloadString は HttpWebRequest の単純なラッパーですが、一時的にそれを使用して速度が向上するかどうかを確認できますか? 物事がもっと速くなったら、コードを共有して、何が問題なのかを調べてもらえますか?

編集:

HttpWebRequest は IE の「最大同時接続数」設定を監視しているようですが、これらの URL は同じドメインにありますか? 接続制限を増やして、それが役立つかどうかを確認できますか? この問題に関する次の記事を見つけました。

デフォルトでは、2 ~ 3 回を超える非同期 HttpWebRequest を実行することはできません (OS によって異なります)。それをオーバーライドするには (最も簡単な方法、私見)、アプリケーションの構成ファイルのセクションの下にこれを追加することを忘れないでください。

<system.net>
  <connectionManagement>
     <add address="*" maxconnection="65000" />
  </connectionManagement>
</system.net>
于 2009-05-23T11:31:37.593 に答える
4

私は同じ問題を抱えていましたが、HttpWebRequest の Proxy パラメータを null に設定すると、問題は解決しました。

UriBuilder ub = new UriBuilder(url);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create( ub.Uri );
request.Proxy = null;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
于 2010-09-23T12:35:09.237 に答える
1

Application Config メソッドが機能しないことがわかりましたが、問題は依然としてプロキシ設定が原因でした。私の単純なリクエストは、以前は最大 30 秒かかっていましたが、今では 1 秒かかります。

public string GetWebData()
{
            string DestAddr = "http://mydestination.com";
            System.Net.WebClient myWebClient = new System.Net.WebClient();
            WebProxy myProxy = new WebProxy();
            myProxy.IsBypassed(new Uri(DestAddr));
            myWebClient.Proxy = myProxy;
            return myWebClient.DownloadString(DestAddr);
}
于 2010-06-24T13:37:36.667 に答える
1

私は同じ問題を抱えていましたが、最悪でした。応答 = (HttpWebResponse)webRequest.GetResponse(); 私のコードでは、さらにコードを実行する前に約 10 秒遅れ、その後、ダウンロードによって接続が飽和状態になりました。

カートの答え defaultProxy enabled="false"

問題を解決しました。現在、応答はほぼ瞬時に行われ、接続の最大速度で任意の http ファイルをダウンロードできます :) 英語が下手で申し訳ありません

于 2010-02-21T15:19:34.127 に答える
1

ServicePointManager.maxConnections を試しましたか? 私は通常、これに似たもののために 200 に設定します。

于 2010-02-14T02:03:29.043 に答える
0

答えてくれてありがとう、彼らは私が適切な方向に掘り下げるのを助けてくれました。私は同じパフォーマンスの問題に直面しましたが、アプリケーション構成ファイルを変更するための提案されたソリューション (ソリューションは Web アプリケーション用であることがわかっているため) は私のニーズに合わないため、私のソリューションを以下に示します。

HttpWebRequest webRequest;

webRequest = (HttpWebRequest)System.Net.WebRequest.Create(fullUrl);
webRequest.Method = WebRequestMethods.Http.Post;

if (useDefaultProxy)
{
    webRequest.Proxy = System.Net.WebRequest.DefaultWebProxy;
    webRequest.Credentials = CredentialCache.DefaultCredentials;
}
else
{
    System.Net.WebRequest.DefaultWebProxy = null;
    webRequest.Proxy = System.Net.WebRequest.DefaultWebProxy;
}
于 2012-02-08T18:10:47.080 に答える
0

マルチスレッドでこの問題を解決できないのはなぜですか? マルチスレッド化により、ネットワークの待機時間が最小限に抑えられます。また、バッファの内容がシステム メモリ (RAM) に保存されるため、ファイル システムの処理による IO のボトルネックは発生しません。したがって、ダウンロードと解析に 82 秒かかる 82 ページは、15 秒ほどかかるはずです (4x プロセッサを想定)。何か不足している場合は修正してください。

____ スレッドをダウンロード_____*

ダウンロードコンテンツ

フォーム ストリーム

目次を読む

_________________________*

于 2014-12-31T01:46:52.837 に答える