方案如下。我有一个纯文本文件,其中包含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)。有没有办法改进上面的代码,以便它能够处理大量的数据?
干杯, 罗伯特
答案 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() ; - )