Groovy:使用StreamingMarkupBuilder处理大量数据

时间:2010-10-20 08:45:25

标签: xml groovy memory-management out-of-memory

方案如下。我有一个纯文本文件,其中包含2,000,000行ID和ID。需要将此ID列表转换为简单的XML文件。只要输入文件中只有几千个条目,下面的代码就可以正常工作。

def xmlBuilder = new StreamingMarkupBuilder()
def f = new File(inputFile)
def input = f.readLines()
def xmlDoc = {
  Documents {
    input.each {
      Document(myAttribute: it)
    }
  }
}

def xml = xmlBuilder.bind(xmlDoc)
f.write(xml)

如果处理了2,000,000个条目,我将获得Java堆的OutOfMemoryException(设置为1024M)。有没有办法改进上面的代码,以便它能够处理大量的数据?

干杯, 罗伯特

2 个答案:

答案 0 :(得分:3)

该解决方案的问题在于它在写出来之前将所有内容加载到内存中......

这可能是一个更好的解决方案,因为我认为它应该在处理output.xml时将数据写入文件input.txt

import groovy.xml.MarkupBuilder

new File( 'output.xml' ).withWriter { writer ->
  def builder = new MarkupBuilder( writer )
  builder.Documents {
    new File( 'input.txt' ).eachLine { line ->
      Document( attr: line )
    }
  }
}

答案 1 :(得分:0)

这是你的问题:def input = f.readLines() ; - )