0

我有一个从 JSON 对象中提取信息的 java servlet。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 的。)

解决此问题的另一种方法是重组 UI,这样您就不会尝试在一个页面中发送 50,000 个结果。要么做一些服务器端的工作来减少/提取结果,使用某种结果集分页,要么在用户的浏览器中做一些聪明(和高效)的东西来动态呈现结果。(最后一个选项将涉及将结果以 JSON 格式发送到浏览器,并且需要大量浏览器端编码来呈现数据、浏览器独立性问题等!)

期望用户浏览包含 50,000 个结果的页面的 Web UI 几乎无法使用(IMO)。

于 2011-07-28T00:40:52.027 回答
0

如果您通过 HTTP 手表或浏览器插件(例如 chrome 的)在浏览器上放置手表,您会注意到浏览器在处理数据时可能会被锁定在某些活动中。

例如,当使用 HTML 表格呈现数据时,浏览器会等待渲染表格所需的整个数据组首先到达,然后再开始渲染整个表格。这是 HTML TABLE 与 HTML DIV 的争论之一。因此,您可能需要查看是否一直在使用 TABLE 来呈现此类数据并考虑切换到 DIV。

是使用 DIV 渲染网格状结构的示例和指南。

可能还有其他因素。因此,请注意您的浏览器活动并查看瓶颈是什么。

于 2011-07-28T00:15:35.663 回答