Groovy: обработка больших объемов данных с помощью StreamingMarkupBuilder - PullRequest
1 голос
/ 20 октября 2010

Сценарий следующий. У меня есть простой текстовый файл, который содержит 2 000 000 строк с идентификатором. Этот список идентификаторов необходимо преобразовать в простой файл 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 записей, я получаю исключение OutOfMemoryException для кучи Java (установлено на 1024M). Есть ли способ улучшить приведенный выше код, чтобы он мог обрабатывать большие объемы данных?

Cheers, Роберт

Ответы [ 2 ]

3 голосов
/ 20 октября 2010

Проблема с этим решением заключается в том, что оно загружает все в память перед записью ...

Это может быть лучшим решением, так как я считаю, что следует записывать данные в файл 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 )
    }
  }
}
0 голосов
/ 24 октября 2010

вот ваша проблема: def input = f.readLines () ; -)

...