Как сделать Java-сервлет, выводящий много данных, более эффективным? - PullRequest
0 голосов
/ 28 июля 2011

У меня есть Java-сервлет, который извлекает информацию из объекта JSON. Объект JSON состоит из результатов поиска по индексированным данным (эластичный поиск). Это хорошо работает, если результатов мало, но когда их много, это значительно замедляется. Если количество результатов превысит 50000, это может привести к сбою браузера. Что можно сделать, чтобы повысить эффективность обработки большого количества результатов, чтобы браузер не зависал.

Вот мой код:

//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>");
}

Ответы [ 2 ]

2 голосов
/ 28 июля 2011

Из вашего вопроса неясно, где реальное узкое место:

  • Это может быть скорость, с которой ваша JSP может извлекать данные из объекта JSON.

  • Это может быть скорость, с которой JSP может форматировать данные и записывать их.

  • Это может быть скорость передачи по сети.

  • Это может быть скорость, с которой браузер может читать и отображать ответ.

Решение будет зависеть от того, где на самом деле находится узкое место, поэтому вам нужно выяснить это, профилировав серверную часть и отслеживая происходящее в браузере.Решение может включать изменение генерируемого вами HTML-кода, чтобы он был меньше или быстрее отображался, или изменение способа его генерации;например, упрощение JSON.(В вашем случае последнее может не подойти, поскольку вы получаете JSON от внешней службы.)

Другой способ решения этой проблемы - реструктурировать пользовательский интерфейс, чтобы вы не пытались отправить50 000 результатов на одной странице.Либо выполните некоторую работу на стороне сервера, чтобы уменьшить / преобразовать результаты, используйте какую-то подкачку результирующего набора или сделайте некоторые умные (и эффективные) вещи в браузере пользователя для динамического представления результатов.(Последний вариант предполагает отправку результатов в браузер в формате JSON и требует большого количества кодирования на стороне браузера для отображения данных, проблем независимости браузера и т. Д.!)

Веб-интерфейс пользователя, ожидающий пользователяпробираться по странице, содержащей 50 000 результатов, (IMO) практически невозможно.

0 голосов
/ 28 июля 2011

Если вы разместите часы в своем браузере, либо через HTTP-часы, либо через плагин браузера (например, chrome), вы заметите, что браузер может быть заблокирован в некоторых действиях при обработке данных.

Например, при использовании таблиц HTML для представления данных браузер ожидает, когда вся группа данных, необходимая для отображения таблицы, сначала появится, прежде чем начать отображение всей таблицы.Это один из аргументов HTML TABLE против HTML DIV.Следовательно, вы можете посмотреть, использовали ли вы TABLE для рендеринга таких данных, и рассмотреть возможность перехода на DIV.

Здесь - это пример и руководство по использованию DIV для визуализации структур, подобных сетке.

Могут быть и другие факторы.Поэтому поместите часы в свой браузер и посмотрите, что является узким местом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...