Quiero escribir algunos datos en un archivo XML (el archivo XML vendría a ~ 50 MB).creando archivos grandes xml en ruby
Encontré nokogiri (1.5.0) joya para ser el más eficiente para analizar (solo leer y no escribir). Nokogiri no es una buena opción para escribir en un archivo XML, ya que contiene los datos XML completos en la memoria hasta que finalmente los escribe.
Encontré el constructor (3.0.0) como una buena opción pero no estoy seguro si es la mejor opción.
he intentado algún punto de referencia con el siguiente código simple:
(1..500000).each do |k|
xml.products {
xml.widget {
xml.id_ k
xml.name "Awesome widget"
}
}
end
Nokogiri toma alrededor de 143 segundos y también el consumo de memoria aumenta gradualmente y finalmente terminó en alrededor de 700 MB.
El generador tardó unos 123 segundos y el consumo de memoria fue lo suficientemente estable en 10 MB.
¿Existe una mejor solución para escribir enormes archivos XML (50 MB) en Ruby? archivo
Nokogiri: archivo
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
Constructor:
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
Re de análisis: Nokogiri es bastante fácil de usar, pero cuando la velocidad es la clave, voy por sólo escribir un analizador SAX (disponible en nogokiri también) . Tengo una práctica clase de utilidades que utilizo para crear rápidamente una variedad de cosas que necesito de un xml (siempre que el xml sea bastante simple) https://gist.github.com/854726 de lo contrario podría tener que escribe un saxparser personalizado. – sunkencity
Lo tomó de otra manera ... Quiero construir xml desde una matriz (registro activo). –
Era un comentario sobre "Encontré nokogiri (1.5.0) joya para ser el más eficiente para analizar", mi punto es que la forma más eficiente de analizar es usar la api saxparser directamente. – sunkencity