さまざまなリモートソースからの読み取り:スレッドを最適化する方法は?

マーク

私はネットの周りの膨大な数のウェブページを読む必要があります。これは、リモートWebページを取得するために実際に使用している方法です。現在のコードは100%機能していることに注意してください。

    static private GetWebPageResult getWebPage(PageNode pagenode)
{
    String result;
    String inputLine;
    URI url;
    int cicliLettura=0;
    long startTime=0, endTime, openConnTime=0,connTime=0, readTime=0;
    try
    {
        startTime=System.nanoTime();
        result="";
        url=pagenode.getUri();      //fare qualcosa se getURI è null
        if(Core.logGetWebPage())
            openConnTime=System.nanoTime();
        if(url!=null)
        {
            HttpURLConnection yc = (HttpURLConnection) url.toURL().openConnection(); //controllare yc
            if(url.toURL().getProtocol().equalsIgnoreCase("https"))
                yc=(HttpsURLConnection)yc;
            yc.addRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB;     rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 (.NET CLR 3.5.30729)"); 
            yc.connect();           //controllare il risultato di .connect => non c'è! al max lancia IOEXC
            if(checkResponseCode(yc.getResponseCode())==false)
                return new GetWebPageResult(GetWebPageResult.ERR_BAD_RESPONSE_CODE,yc.getResponseCode());
            if(Core.logGetWebPage())
                connTime=System.nanoTime();

            BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()));//può lanciare IOEXC
            /*
            while ((inputLine = in.readLine()) != null)
            {
                result=result+inputLine+"\n";
                cicliLettura++;
            }*/
            StringBuffer buffer = new StringBuffer();
            while ((inputLine = in.readLine()) != null)
            {
                buffer.append(inputLine).append('\n');
                cicliLettura++;
            }
            result = buffer.toString();

            if(Core.logGetWebPage())
                readTime=System.nanoTime();
            in.close();
            yc.disconnect();
            if(Core.logGetWebPage())
            {
                endTime=System.nanoTime();
                        //url.toURL() non è null, controllato prima
                System.out.println(/*result+*/"getWebPage eseguito in "+(endTime-startTime)/1000000+" ms. Size: "+result.length()+" Response Code="+yc.getResponseCode()+" Protocollo="+url.toURL().getProtocol()+" openConnTime: "+(openConnTime-startTime)/1000000+" connTime:"+(connTime-openConnTime)/1000000+" readTime:"+(readTime-connTime)/1000000+" cicliLettura="+cicliLettura+" pagina:"+url.toURL());
            }
            return new GetWebPageResult(result);
        }
        else
            return new GetWebPageResult(GetWebPageResult.ERR_NULL_URI,-2);
    }catch(IOException e){
        System.out.println("Eccezione1: "+e.toString());
        e.printStackTrace();  
        return new GetWebPageResult(GetWebPageResult.ERR_HTML_IOEXCEPTION,-2);
    }catch(ClassCastException e){
        System.out.println("Eccezione2: "+e.toString());
        e.printStackTrace(); 
        return new GetWebPageResult(GetWebPageResult.ERR_CLASS_CAST_EXC,-2);
    }catch(Exception e){
        System.out.println("Eccezione ERR_NOT_LISTED_EXC: "+e.toString());
        return new GetWebPageResult(GetWebPageResult.ERR_NOT_LISTED_EXC,-2);
    }
}

URLがnullでない場合は、コードを詳しく見てみましょう。

HttpURLConnection yc = (HttpURLConnection) url.toURL().openConnection(); //controllare yc
            if(url.toURL().getProtocol().equalsIgnoreCase("https"))
                yc=(HttpsURLConnection)yc;
            yc.addRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB;     rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 (.NET CLR 3.5.30729)"); 
            yc.connect();           //controllare il risultato di .connect => non c'è! al max lancia IOEXC
            if(checkResponseCode(yc.getResponseCode())==false)
                return new GetWebPageResult(GetWebPageResult.ERR_BAD_RESPONSE_CODE,yc.getResponseCode());

.openConnectionメソッドと.connectメソッドの違いは何ですか?とにかく、接続を開くと、データの読み取りを開始します

                BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()));//può lanciare IOEXC
            StringBuffer buffer = new StringBuffer();
            while ((inputLine = in.readLine()) != null)
            {
                buffer.append(inputLine).append('\n');
                cicliLettura++;
            }
            result = buffer.toString();

さて、今私はデータを読み取るBufferedReaderを持っています。問題は、私の帯域幅がリモートマシンの帯域幅よりもはるかに大きいことが非常に多いため、「同時に」さまざまなソースから読み取ることができるようにしたいということです。良い方法は、多くのスレッドを起動し、このようにコードの最後の部分を変更するようです

ファイルの終わりではありませんが、読むべき完全な行はありますか?はいの場合は、新しい行を要求します。そうでない場合は、少し眠ります。この時点で、私は次の読書スレッドに進み、同じことをします。それが正しいか?これを実装する方法は?

CKing

これは、古典的な生産者/消費者シナリオのように見えます。次のクラスを作成することで、アプリケーションを最適化できます。BlockingQueueの概念と生産者/消費者問題をまだ認識していない場合は、私の回答/設計に進む前にこれを読むことをお勧めします

  1. WebPageResult:Webページのコンテンツを表すPojo。Webページの結果を保持するStringBufferと、コンテンツの対象となるページを識別するWebページの名前/ URLが含まれています。
  2. ProcessingQueue:ありシングルトンクラスArrayBlockingQueueをPageNodeは、このキューからPageNodeを追加し、ポーリングするオブジェクトとメソッドを保持
  3. ResultQueue:持っているAシングルトンクラスArrayBlockingQueueをWebPageResultは、このキューからWebPageResultを追加し、ポーリングするオブジェクトとメソッド保持しています。
  4. WebPageReader:Runnableを実装し、while(true)ループでrunメソッドのProcessingQueueからpollメソッドを呼び出し、キューからポーリングされたPageNodeの内容を読み取ります。PageNodeから読み取られたコンテンツは、WebPageResultにラップされ、ResultQueueのaddメソッドを呼び出してResultQueueに入れられる必要があります。
  5. WebPageProcessor:Runnableを実装し、while(true)ループでrunメソッドのResultQueueからpollメソッドを呼び出してから、このコンテンツで必要な処理を実行します。

ここで行う必要があるのは、PageNodeオブジェクトをProcessingQueueに追加し、WebPageReaderスレッドとWebPageProcessorスレッドを開始して、魔法が起こるのを監視することだけです。説明が必要な場合はお知らせください。要件に応じて、1つのWebPageReaderスレッドとWebPageProcessorスレッドのみまたは複数のスレッドを開始することを選択できます。デザインは両方をサポートします。また、Webをクロールするか、クロールするページについて何らかのデータベースをポーリングすることにより、PageNodeオブジェクトをProcessingQueueに追加するためのスレッドをもう1つ導入できます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

複製されたセットアップでのGlusterFS読み取りディレクトリのパフォーマンス-何が問題になっていますか?最適化する方法は?

分類Dev

ソケット ストリームから読み取るためのスレッドは、より多くの CPU 使用率を必要とします。

分類Dev

radグリッド内のさまざまな行のさまざまなソースからのraddropdownをバインドする方法は?

分類Dev

スイートのさまざまなテストケースで、同じキャッシュスコープのHTTPリクエストからペイロードをモックする方法はありますか?

分類Dev

oracleストアドプロシージャからさまざまなタイプの出力パラメータを読み取る方法は?

分類Dev

TARMKベースのリポジトリを使用するときに使用されるストレージスペースを最適化するさまざまな方法は何ですか

分類Dev

Pythonデコレータを使用して、同様の仕事をするさまざまなメソッドの記述を最適化する方法は?

分類Dev

読み取りパブリック書き込みプライベート変数を迅速に作成するさまざまな方法はありますか?

分類Dev

Java-バッファ付きリーダー(ソケットから)からの読み取りがスレッドを一時停止しています

分類Dev

さまざまな変数を1つで読み取る方法には、ファイルからスペースを含む文字列があります

分類Dev

なぜデータベース複製はデータベースからの読み取りと書き込みを最適化するのですか?

分類Dev

入力ストリームの読み取りを高速化する方法の最適化/連結速度の向上

分類Dev

Javaリフレクトメソッドの呼び出しをさらに最適化する方法はありますか?

分類Dev

さまざまなリソースの作業速度が異なる場合にMSプロジェクトを最適にセットアップする方法

分類Dev

Webサービスメソッドは、リストの最後のオブジェクトのみを読み取ります

分類Dev

csvからの読み取りまたはcsvへの書き込み中にデータフレームのデータ型「リスト」を保持する方法

分類Dev

コンパイラはコードを読み取り、ランダムなメモリ割り当てを最適化しますか?

分類Dev

リモートHadoopクラスターからデータを読み取るHFTPはHTTPとどのように異なりますか?

分類Dev

ソケット入力ストリームが最後の読み取りでハングします。これを処理する最良の方法?

分類Dev

JavaはアトミックAPIなどのAtomicIntegerせずに、共有リソース/メモリ位置を読み出し/書き込み最適化さ

分類Dev

起動時にチップから MAC アドレスを読み取る Linux または U-Boot のサポートはありますか?

分類Dev

テキストファイルのさまざまな位置からデータを読み取る

分類Dev

UWPさまざまなフォルダーからさまざまなpivotItemsに画像のリストをアップロードする方法

分類Dev

Streamreaderを使用して、.txtファイルからさまざまなリストボックスにさまざまな行のテキストを読み取る方法は?

分類Dev

c#-バッファリングされたストリームを使用することは、ソースストリームでreadメソッドを使用して同じバイト数を読み取ることとどのように異なりますか?

分類Dev

さまざまなリソース(フラットファイル)からデータを読み取るSpringバッチアプリケーションを設計する

分類Dev

ロックなしで複数のスレッドから動的/変化するデータを読み取る?クラッシュを引き起こす可能性はありますか?それとも単に変数が壊れていますか?

分類Dev

さまざまなリストのデータを保存する最良の方法は何ですか?

分類Dev

読み取りアクセスを高速化するために、データを計算シェーダーの共有ストレージに「プリロード」することは理にかなっていますか?

Related 関連記事

  1. 1

    複製されたセットアップでのGlusterFS読み取りディレクトリのパフォーマンス-何が問題になっていますか?最適化する方法は?

  2. 2

    ソケット ストリームから読み取るためのスレッドは、より多くの CPU 使用率を必要とします。

  3. 3

    radグリッド内のさまざまな行のさまざまなソースからのraddropdownをバインドする方法は?

  4. 4

    スイートのさまざまなテストケースで、同じキャッシュスコープのHTTPリクエストからペイロードをモックする方法はありますか?

  5. 5

    oracleストアドプロシージャからさまざまなタイプの出力パラメータを読み取る方法は?

  6. 6

    TARMKベースのリポジトリを使用するときに使用されるストレージスペースを最適化するさまざまな方法は何ですか

  7. 7

    Pythonデコレータを使用して、同様の仕事をするさまざまなメソッドの記述を最適化する方法は?

  8. 8

    読み取りパブリック書き込みプライベート変数を迅速に作成するさまざまな方法はありますか?

  9. 9

    Java-バッファ付きリーダー(ソケットから)からの読み取りがスレッドを一時停止しています

  10. 10

    さまざまな変数を1つで読み取る方法には、ファイルからスペースを含む文字列があります

  11. 11

    なぜデータベース複製はデータベースからの読み取りと書き込みを最適化するのですか?

  12. 12

    入力ストリームの読み取りを高速化する方法の最適化/連結速度の向上

  13. 13

    Javaリフレクトメソッドの呼び出しをさらに最適化する方法はありますか?

  14. 14

    さまざまなリソースの作業速度が異なる場合にMSプロジェクトを最適にセットアップする方法

  15. 15

    Webサービスメソッドは、リストの最後のオブジェクトのみを読み取ります

  16. 16

    csvからの読み取りまたはcsvへの書き込み中にデータフレームのデータ型「リスト」を保持する方法

  17. 17

    コンパイラはコードを読み取り、ランダムなメモリ割り当てを最適化しますか?

  18. 18

    リモートHadoopクラスターからデータを読み取るHFTPはHTTPとどのように異なりますか?

  19. 19

    ソケット入力ストリームが最後の読み取りでハングします。これを処理する最良の方法?

  20. 20

    JavaはアトミックAPIなどのAtomicIntegerせずに、共有リソース/メモリ位置を読み出し/書き込み最適化さ

  21. 21

    起動時にチップから MAC アドレスを読み取る Linux または U-Boot のサポートはありますか?

  22. 22

    テキストファイルのさまざまな位置からデータを読み取る

  23. 23

    UWPさまざまなフォルダーからさまざまなpivotItemsに画像のリストをアップロードする方法

  24. 24

    Streamreaderを使用して、.txtファイルからさまざまなリストボックスにさまざまな行のテキストを読み取る方法は?

  25. 25

    c#-バッファリングされたストリームを使用することは、ソースストリームでreadメソッドを使用して同じバイト数を読み取ることとどのように異なりますか?

  26. 26

    さまざまなリソース(フラットファイル)からデータを読み取るSpringバッチアプリケーションを設計する

  27. 27

    ロックなしで複数のスレッドから動的/変化するデータを読み取る?クラッシュを引き起こす可能性はありますか?それとも単に変数が壊れていますか?

  28. 28

    さまざまなリストのデータを保存する最良の方法は何ですか?

  29. 29

    読み取りアクセスを高速化するために、データを計算シェーダーの共有ストレージに「プリロード」することは理にかなっていますか?

ホットタグ

アーカイブ