Groovy渲染块文件

时间:2018-01-03 15:43:22

标签: file groovy response heap-memory

我正在使用 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的解决方案是完美的,我希望能够理解,但如果块的解决方案以不同的方式存在,那将会很好。

1 个答案:

答案 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