java - 使用 FreeMarker 流式传输巨大列表,内存不足异常

标签 java out-of-memory freemarker

描述

有一个庞大的玩家数据库200.000,下面是.ftl模型:

<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);

 }

...

}

最佳答案

您传递给 FreeMarker 的 Writer 是否缓冲所有输出?也许查看 OutOfMemoryException 通常发生的位置有助于弄清楚这一点。

除此之外,我不知道为什么较长的列表会在 FreeMarker 中消耗更多的内存。至少在您展示的这样一个基本用例中,它应该能够保持渲染,甚至是无限列表。

此外,如果您使用的是 Iterator 而不是 List,它也会释放数据源的内存(如 ResultSet 也许)足够聪明,不会缓冲所有内容。

关于java - 使用 FreeMarker 流式传输巨大列表,内存不足异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56017977/

相关文章:

java - Eclipse javascript 字符编码

java - 无法访问和连接到 MySQL 服务器数据库

java - 如何在jtable中加载1000+图像而不出现java.lang.OutOfMemoryError : Java heap space exception

java - 我如何反省 freemarker 模板以找出它使用的变量?

java - freemarker 模板和 smooks 中的注释

java - 有关 Spring 和 JMS 的帮助。我正在尝试使用 spring 设置一个简单的发布者?

java - 如何扫描整个 C 盘的播放列表

java - 生成大型列表的笛卡尔积时出现 OutOfMemoryError

matlab - 在matlab中将两个大矩阵相乘会产生内存不足错误

java - Freemarker 循环似乎没有按顺序打印