none
Webデータを高速で取得するには? RRS feed

  • 質問

  • VB.netにて、Webデータ(具体的にはYahooFinance株価)を取得するプログラムを作成しましたが、他の方が作られたソフトに比べ速度が遅く悩んでいます。そこで以下の質問があります。ご存知の方がおられましたら、ご教示ください。

    作成プログラム内容
    □.netのWebClientを使用し、HTMLデータを取得
    □.netのRegular Expressionで必要部分を抽出
    □テキストファイルに書き出し(csv形式)
    □上記のプロセスをマルチスレッド化

    質問したいこと
    □形式で表示されているWebデータを、VB.netにて最も高速に取得・処理する方法を教えてください。

    □もう少し詳しく言うと、VB6.0時代の経験では、Webデータを取得・処理する場合、上記のやり方とVBからIEオブジェクトを使用しデータ処理するやり方があったと思いますが(このときは、自分の経験では上記の正規表現を使った方が速かった)、VB.netでは標準でこれを高速にやるようなクラスはありますか?

    長くなりましたが、以上よろしくお願いいたします。

    2006年5月28日 3:08

すべての返信

  • どこの部分で時間がかかっているのでしょうか。そこをまずはっきりしないと助言を得るのは難しいのでは?

    ちなみに,.netでもHTMLDocumentからDOMツリーを検索するよりも,直接HTMLを正規表現などで検索した方が高速なのは間違いないとおもいます。

    2006年5月28日 3:59
  • YAS様

    ご回答ありがとうございます。どの部分について時間がかかっているかは追って調査後、このスレで相談させていただきたくお願い申し上げます。

    なお、本件の調査時に気づいたのですが、.netは変数の受渡しをByVal型で行うのがデフォルトですが、私は高速化のためにByRef型としています。ここは問題ありますか?もしかしたらケースバイケースかもしれませんが・・・ 参考にさせていただける情報をご教示いただければ幸いです。

    よろしくお願いしたします。

    2006年5月28日 6:01
  • ByRefにすると高速化されるのですか? 初めて知りました。

    しかし,ByRefにすると呼び出し側の値が書き換わるおそれがあるので,なんだか見つけづらいバグをつくってしまうような気がします。どの程度高速化されるのかは存じませんが,私は普通にByValで呼び出した方がよいと思います。

    また,文字列型のような参照型をByRefで渡したら余計時間がかかりそうな気がしますが....

    2006年5月28日 6:27
  • YASさんのおっしゃるとおり文字列方はByRefの方が時間がかかるかもしれません。
    ByRefが速いかどうかははっきりと確認できていません。
    (私のうるおぼえの記憶です。すみません。)

    原因の調査を少しやりましたが、自分のプログラムと他人のソフトで、スレッド数を1つにしたときは概ね同じ程度の速度でした。このため、スレッド化している部分が怪しいと思っていますが、スレッド化についてはネット上で見かけるデリゲートを用いたやり方をしているので、同じ方法を使っているならば速度に差は出ないように思っています。スレッド化は使う方法等で速度に差がでてきますか?

     

    2006年5月28日 6:57
  • より速いスレッドの作成方法については残念ながら聞いたことがありません。

    どの程度のスレッドを走らせているのかわかりませんが,例えばWebClientクラスを100も200も同時に走らせたらずいぶんリソースを食いそうな気がします。WebRequest/WebResponseクラスやSocketクラスを使ってみたらどうでしょうか。

    また,StopWatchクラスをところどころに仕込んで実行時間をDebug.Printするという原始的な方法でもよいのでスレッドを増やしたときのオーバーヘッドを計測してみるとよいと思います。

    2006年5月28日 7:08
  • .NET では、参照型であれば ByVal で渡すのはインスタンスの参照ですから、ByRef で渡すのと大きさは変わりません。ByRef を使うのは、呼び出し先でインスタンスそのものが他のものに変わる(インスタンスのメンバの変更ではないですよ)というあまり無い状況でのみ使うべきです。

    スレッドを増やしたら、ということなら、なんとなくこの問題のような気が。

    http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=356622&SiteID=7

    2006年5月28日 7:10
  • Hongliangさん

    ご回答ありがとうございます。
    上記のリンク先に書いてある接続時のリミット制限を変えたところ速度が向上したように思います。

    ありがとうございました。非常に参考にさせていただきました。

    みなさま、またよろしくお願いします。

    2006年5月28日 10:05
  • この後いろいろ調査した結果、どうやらWebデータすなわちHtmlソースの取得のところが、
    他の方のソフトに比べて時間がかかっているようです。
    (といっても通常いろいろなHPで照会されている、WebClientまたはWebRequest等を
    通常通り使っているので問題ないと思っていますが。)

    そこで質問ですが、Socketを使うとHtmlの取得が速くなりますか?
    またこれら以外に高速にHtmlを取得できる方法をご存知の方がおられましたら、
    ご教示いただけないでしょうか。よろしくお願いします。

    2006年8月18日 18:32
  • (再度投稿します)

    この後いろいろ調査した結果、どうやらWebデータすなわちHtmlソースの取得のところが、
    他の方のソフトに比べて時間がかかっているようです。
    (といっても通常いろいろなHPで紹介されている、WebClientまたはWebRequest等を
    通常通り使っています)

    そこで質問ですが、これらを使って、または、これらよりもっと速くHtmlソースを取得する方法
    は有りますでしょうか?
    現在、WebClientもしくはWebRequestでYahooファイナンス時系列の1ページの取得に
    0.1~0.2秒ほどかかっていますが、他の方の速いソフトはおそらくこれよりも1桁ないし
    2桁高速でデータ取得を行っているようなのです。

    いろいろ試しましたが良策が見つかりません。どうか助けてください。
    よろしくお願いします。

    2006年8月22日 16:58
  • たぶん、一銘柄毎にHttpWebRequest.CreateでWebRequestオブジェクトを作成されていると思いますので、ここで時間がかかっているのではないでしょうか?

    HTTPは単純なプロトコルですので、ソケットを使ってテストされてみたらいかがでしょうか?
    以下などにサンプルソースがあります。

    Socket クラス
    http://msdn2.microsoft.com/ja-JP/library/system.net.sockets.socket.aspx

    Socketを使ってファイルをダウンロードし表示する
    http://dobon.net/vb/dotnet/internet/downloadusesocket.html

    2006年8月23日 5:05
    モデレータ
  • trapemiya様

    回答ありがとうございます。

    WebClientのオブジェクトをPublic変数とし、毎回の取得ではOpenReadのみを
    行うようにしましたが、速度は変わりませんでした。

    これまで、
    ■WebClient.OpenRead
    ■WebClientDownloadData
    ■GetHttpStream
    ■MSXML
    ■Socket
    などでHTML取得を試しましたが、どれも速度はほぼ同じでした。

    何かいい方法はないでしょうか。ご教示よろしくお願いいたします。

     

    2006年8月25日 13:10