[英]Stream Huge Lists with FreeMarker , out of memory exception
描述
有一個龐大的玩家數據庫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);
}
...
}
您傳遞給FreeMarker的Writer
是否會緩沖所有輸出? 也許看到OutOfMemoryException
通常發生在哪里有助於弄清楚這一點。
除此之外,我不知道為什么更長的列表會在FreeMarker中消耗更多的內存。 至少在您展示的這種基本用例中,它甚至應能夠保持渲染無限列表。
另外,如果不是一個List
,你使用的是Iterator
,就也釋放內存作為數據(如源ResultSet
可能)是足夠聰明,不緩沖它的全部。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.