0

JSONオブジェクトから情報を引き出すJavaサーブレットがあります。JSONオブジェクトは、インデックス付きデータからの検索結果で構成されます(エラスティック検索)。これは、結果が少ない場合はうまく機能しますが、結果が多い場合は大幅に遅くなります。結果の数が50,000を超える場合、ブラウザがクラッシュすることがあります。ブラウザがクラッシュしないように、多数の結果をより効率的に処理するために何ができるでしょうか。

これが私のコードです:

//Result Count
int i = 1;

for (SearchHit sh : response.getHits().hits()) {
    out.println("Result " + i + " <br>");

    out.println("&nbsp;&nbsp;&nbsp;&nbsp;" + sh.getSource().get("@message").toString() + " <br>");

    HashMap hm = (HashMap) sh.getSource().get("@fields");

    Iterator it = hm.entrySet().iterator();

    while (it.hasNext()) {

        Map.Entry pairs = (Map.Entry)it.next();
        out.println("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + pairs.getKey() + " = " + pairs.getValue().toString().replace("[", "").replace("]", "") + " <br>");
    }
    i++;
    out.println(" <br>");
}
4

2 に答える 2

2

あなたの質問からは、実際のボトルネックがどこにあるかは明らかではありません。

  • これは、JSP が JSON オブジェクトからデータを取得できる速度である可能性があります。

  • これは、JSP がデータをフォーマットして書き込む速度である可能性があります。

  • それは、ネットワーク転送速度である可能性があります。

  • ブラウザーが応答を読み取ってレンダリングできる速度である可能性があります。

解決策は、ボトルネックが実際にどこにあるかによって異なるため、サーバー側をプロファイリングし、ブラウザーで何が起こっているかを監視して、これを把握する必要があります。解決策としては、生成する HTML を変更してサイズを小さくするか、レンダリングを高速化するか、生成方法を変更する必要があります。たとえば、JSON を単純化します。(あなたの場合、外部サービスから JSON を取得しているため、後者はオプションではない可能性があります。)

これに対処するもう 1 つの方法は、1 ページで 50,000 件の結果を送信しないように UI を再構築することです。結果を削減/抽出するためにサーバー側の作業を行うか、何らかの結果セットのページングを使用するか、ユーザーのブラウザーで巧妙な (そして効率的な) 処理を行って結果を動的に表示します。(最後のオプションでは、結果を JSON としてブラウザーに送信する必要があり、データをレンダリングするための多くのブラウザー側のコーディング、ブラウザーの非依存性の問題などを伴います!)

ユーザーが 50,000 件の結果を含むページを通り抜けることを期待する Web UI は、(IMO) ほとんど使用できません。

于 2011-07-28T00:40:52.027 に答える
0

HTTP ウォッチまたはブラウザ プラグイン (Chrome など) を介してブラウザにウォッチを配置すると、データの処理中に一部のアクティビティでブラウザがロックされることがあります。

たとえば、HTML テーブルを使用してデータを表示する場合、ブラウザは、テーブル全体のレンダリングを開始する前に、テーブルのレンダリングに必要なデータのグループ全体が最初に到着するのを待ちます。これは、HTML TABLE と HTML DIV の引数の 1 つです。したがって、そのようなデータのレンダリングに TABLE を使用しているかどうかを確認し、DIV への切り替えを検討することをお勧めします。

DIV を使用してグリッドのような構造をレンダリングする例とガイドを次に示します。

他の要因もあるかもしれません。したがって、ブラウザのアクティビティを監視し、ボトルネックが何であるかを確認してください。

于 2011-07-28T00:15:35.663 に答える