代码之家  ›  专栏  ›  技术社区  ›  Robert Strauch

groovy:使用streamingmarkupbuilder处理大量数据

  •  1
  • Robert Strauch  · 技术社区  · 15 年前

    场景如下。我有一个纯文本文件,其中包含2000000行和一个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)
    

    如果处理了2000000个条目,我将获得Java堆的OutOfMeMyExeExchange(设置为1024M)。有没有办法改进上述代码,使其能够处理大量数据?

    干杯, 罗伯特

    2 回复  |  直到 15 年前
        1
  •  3
  •   tim_yates    15 年前

    这个解决方案的问题是,在写出来之前,它正在将所有的东西加载到内存中…

    这可能是一个更好的解决方案,因为我认为它应该将数据写到文件中。 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 )
        }
      }
    }
    
        2
  •  0
  •   Steven    15 年前

    这是您的问题:def输入=f.readlines()。 ;-)