我正在使用 StreamingMarkupBuilder 来生成非常大的xml文件。文件太大了,我已经设置了
JAVA_OPT="-XX:NewSize=2048m -XX:MaxNewSize=4096m -XX:SurvivorRatio=8 -Xms4096m -Xmx4096m -XX:MaxPermSize=4096m"
(2048米,1024米还不够)
没有块我到目前为止得到了文件,回复答案:
*0:0:0:0:0:0:0:1 - - [03/Jan/2018:17:15:37 +0200] "GET ... HTTP/1.1" 200 167467288*
服务:
def builder = new StreamingMarkupBuilder()
def Header = {
mkp.xmlDeclaration()
mkp.declareNamespace('': 'http://...')
...
...
Header{
SourceDocuments {
SalesInvoices {
// !!!big scope of data came in this loop!!!
for (row in data) {
Invoice {
...
...
}
}
}
}
}
XmlUtil.serialize(builder.bind(Header))
注意:只有 builder.bind(标题)作为最后一个结果行创建文件非常慢。
控制器:
response.contentType = grailsApplication.config.grails.mime.types[exportFormat]
response.setHeader("Content-disposition", "attachment; filename=" + reportName + "." + exportFormat)
response.outputStream << result
我正在寻找响应文件的块解决方案,并最小化JAVA_OPT
环境堆大小。实际上,由于性能的原因,获得DOM的解决方案是完美的,我希望能够理解,但如果块的解决方案以不同的方式存在,那将会很好。
答案 0 :(得分:0)
这个答案不是关于分块而是关于性能
这里有4个使用时间结果比较呈现xml的例子
请注意,StreamingMarkupBuilder会消耗最少的内存,因为它会直接将xml呈现给输出(文件),而不会在内存中构建它
在其他情况下,我们在内存中构建xml,然后渲染到输出
最快的一个是主循环的CompileStatic注释
./test.sh xaa
./test.sh xab
./test.sh xac
./test.sh xad
代码:
START: StreamingMarkupBuilder
END: 23946 sec
START: DOMBuilder
END: 8282 sec
START: NodeBuilder
END: 8778 sec
START: NodeBuilder+CompileStatic
END: 2978 sec