Потоковые огромные списки с FreeMarker, исключение нехватки памяти - PullRequest
0 голосов
/ 07 мая 2019

Описание

Существует большая база игроков 200.000 и ниже .ftl model:

<header> ... <header>
<main>
!Here is the problem
<#list items as vo>
  <name> $vo.name} </name>
  <surname> ${vo.surname} </surname>
  <abilities> ${vo.abilities} </abilites>
</#list>
</main>
<footer>  ... </footer>

Так что не так?

Вышеописанное работает хорошо, когда у меня небольшое количество игроков, скажем, 5.000.

Что я пытаюсь сделать?

Мне нужно создать этот документ сразу для всех игроков, что означает, что я должен передать список с 100.000 или более игроками. Это вызовет Java OutOfMemoryException.

Так что я каждый раз выбираю 1.000 игроков и создаю список, но проблема в том ... как пройти всех игроков, как раньше? У меня есть одна .ftl модель и FreeMarker не поддерживает что-то подобное ...

Я хочу, чтобы все 200.000 игроков были в одном документе.

Какую технику я должен использовать :)?

Класс Java выглядит следующим образом:

public FinalXMLVo extends HashMap<String,Object>{

 ...
 private List<Player> players;

 public FinalXMLVo(....,List<Player> players){

  ...
  this.put("items",players);

 }

...

}

1 Ответ

1 голос
/ 11 мая 2019

Передает ли Writer в буфер FreeMarker весь вывод?Возможно, выяснение того, где обычно происходит OutOfMemoryException, помогает понять это.

Кроме этого, я не знаю ни одной причины, по которой более длинный список потребляет больше памяти во FreeMarker.По крайней мере, в таком базовом сценарии использования, который вы показываете, он должен поддерживать рендеринг даже бесконечного списка.

Кроме того, если вместо List вы используете Iterator, это также освобождаетобъем памяти, насколько источник данных (например, ResultSet, может быть) достаточно умен, чтобы не буферизовать все это.

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