Desidero scrivere alcuni dati in un file XML (il file XML verrebbe a ~ 50 MB).creazione di file xml di grandi dimensioni in rubino
Ho trovato nokogiri (1.5.0) gem per essere il più efficiente da analizzare (Basta leggere e non scrivere). Nokogiri non è una buona opzione per scrivere in un file XML poiché conserva i dati XML completi in memoria fino a quando non scrive definitivamente.
Ho trovato il builder (3.0.0) per essere una buona opzione, ma non sono sicuro che sia l'opzione migliore.
Ho provato alcuni benchmark con il seguente codice semplice:
(1..500000).each do |k|
xml.products {
xml.widget {
xml.id_ k
xml.name "Awesome widget"
}
}
end
Nokogiri dura circa 143 secondi e anche il consumo di memoria aumentata gradualmente e si è conclusa, infine, a circa 700 MB.
Il builder ha impiegato circa 123 secondi e il consumo di memoria era abbastanza stabile a 10 MB.
Quindi c'è una soluzione migliore per scrivere enormi file XML (50 MB) in Ruby? file di
Nokogiri: file di
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
Re di analisi: Nokogiri è abbastanza facile da usare, ma quando la velocità è la chiave, vado solo per la scrittura di un parser SAX (disponibile in nogokiri pure) . Ho una pratica classe di utilità che uso per creare rapidamente una serie di elementi di cui ho bisogno da un xml (a condizione che l'xml sia piuttosto semplice) https://gist.github.com/854726 se potrei dover scrivi un saxparser personalizzato. – sunkencity
Lo hai preso in un altro modo .. Voglio costruire xml da array (record attivo). –
E 'stato un commento su "Ho trovato gemma nokogiri (1.5.0) per essere il più efficiente da analizzare", il mio punto è il modo più efficace per analizzare è quello di utilizzare direttamente l'API saxparser. – sunkencity