Chcę zapisać niektóre dane do pliku XML (plik XML powinien osiągnąć ~ 50 MB).tworzenie dużego pliku xml w rubinach
Znalazłem klejnot nokogiri (1.5.0), aby być najbardziej wydajny do parsowania (tylko czytać i nie pisać). Nokogiri nie jest dobrą opcją zapisu do pliku XML, ponieważ przechowuje kompletne dane XML w pamięci, dopóki nie zapisze się w zapisie.
Znalazłem builder (3.0.0) jako dobrą opcję, ale nie jestem pewien, czy to najlepsza opcja
próbowałem jakiś wzorzec z poniższego prostego kodu:
(1..500000).each do |k|
xml.products {
xml.widget {
xml.id_ k
xml.name "Awesome widget"
}
}
end
Nokogiri zajmuje około 143 sekund, a także zużycie pamięci stopniowo zwiększana, a zakończył się ostatecznie około 700 MB.
Builder trwał około 123 sekundy, a zużycie pamięci było wystarczająco stabilne na poziomie 10 MB.
Czy istnieje lepsze rozwiązanie do pisania dużych plików XML (50 MB) w języku Ruby? Plik
Nokogiri: file
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 analizowaniem: Nokogiri jest przyjazny dość łatwy, ale gdy prędkość jest kluczem, idę za jedyne napisanie parsera sax (dostępny w nogokiri również) . Mam poręczną klasę narzędziową, której używam do niesamowicie szybkiego budowania tablicy rzeczy, których potrzebuję z xml (pod warunkiem, że xml jest całkiem prosty) https://gist.github.com/854726 Jeśli jeszcze nie, będę musiał napisz niestandardowy saxparser. – sunkencity
Zrobiłeś to inaczej. Chcę zbudować xml z tablicy (aktywny rekord). –
To był komentarz do "Znalazłem klejnot nokogiri (1.5.0), aby być najbardziej efektywnym do analizowania", moim celem jest najbardziej efektywnym sposobem analizowania, jest użycie apletu saxparser bezpośrednio. – sunkencity