создание большого файла xml на ruby ​​

Я хочу записать примерно 50 МБ данных в файл XML.

Я обнаружил, что Nokogiri (1.5.0) эффективен для синтаксического анализа при чтении, а не записи. Nokogiri - не лучший вариант для записи в файл XML, поскольку он хранит полные данные XML в памяти до тех пор, пока не будет окончательно записан.

Я нашел Builder (3.0.0) хорошим вариантом, но не уверен, что это лучший вариант.

Я попробовал выполнить несколько тестов с помощью следующего простого кода:

  (1..500000).each do |k|
    xml.products {
      xml.widget {
        xml.id_ k
        xml.name "Awesome widget"
      }
    }
    end

Nokogiri занимает около 143 секунд, а также потребление памяти постепенно увеличивалось и составило около 700 МБ.

Builder занял около 123 секунд, а потребление памяти было достаточно стабильным и составляло 10 МБ.

Есть ли лучшее решение для записи огромных файлов XML (50 МБ) в Ruby?

Вот код с использованием Nokogiri:

require 'rubygems'
require 'nokogiri'
a = Time.now
builder = Nokogiri::XML::Builder.new do |xml|
  xml.root {
    (1..500000).each do |k|
    xml.products {
      xml.widget {
        xml.id_ k
        xml.name "Awesome widget"
      }
    }
    end
  }
end
o = File.new("test_noko.xml", "w")
o.write(builder.to_xml)
o.close
puts (Time.now-a).to_s

Вот код с использованием Builder:

require 'rubygems'
require 'builder'
a = Time.now
File.open("test.xml", 'w') {|f|
xml = Builder::XmlMarkup.new(:target => f, :indent => 1)

  (1..500000).each do |k|
    xml.products {
      xml.widget {
        xml.id_ k
        xml.name "Awesome widget"
      }
    }
    end

}
puts (Time.now-a).to_s
13
задан the Tin Man 23 May 2019 в 21:50
поделиться