Я хочу записать приблизительно 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?
Вот код, использующий Нокогири:
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