Tôi muốn ghi một số dữ liệu vào tệp XML (tệp XML sẽ đến ~ 50 MB).tạo xml tệp lớn trong ruby
Tôi đã tìm thấy nokogiri (1.5.0) đá quý là nhất hiệu quả để phân tích cú pháp (Chỉ đọc và không viết). Nokogiri không phải là một lựa chọn tốt để ghi vào tập tin XML vì nó chứa dữ liệu XML hoàn chỉnh trong bộ nhớ cho đến khi nó ghi cuối cùng ghi lại nó.
Tôi đã tìm thấy người xây dựng (3.0.0) là một lựa chọn tốt nhưng không chắc chắn nếu đó là tùy chọn tốt nhất.
Tôi đã thử một số benchmark với mã đơn giản sau đây:
(1..500000).each do |k|
xml.products {
xml.widget {
xml.id_ k
xml.name "Awesome widget"
}
}
end
Nokogiri mất khoảng 143 giây và cũng tiêu thụ bộ nhớ tăng dần và kết thúc cuối cùng vào khoảng 700 MB.
Trình tạo mất khoảng 123 giây và mức tiêu thụ bộ nhớ đủ ổn định ở mức 10 MB.
Vì vậy, có giải pháp nào tốt hơn để viết các tệp XML khổng lồ (50 MB) trong Ruby không?
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 file:
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 Parsing: Nokogiri là khá thân thiện với người, nhưng khi tốc độ là chìa khóa, tôi đi với giá chỉ viết một phân tích cú pháp SAX (có sẵn trong nogokiri cũng) . Tôi có một lớp tiện ích tiện dụng mà tôi sử dụng để nhanh chóng xây dựng một mảng các công cụ mà tôi cần từ một xml (miễn là xml là khá đơn giản) https://gist.github.com/854726 nếu khác tôi có thể phải viết một saxparser tùy chỉnh. – sunkencity
Bạn đã lấy nó theo cách khác .. Tôi muốn xây dựng xml từ mảng (bản ghi hoạt động). –
Đó là một nhận xét về "Tôi tìm thấy nokogiri (1.5.0) đá quý là hiệu quả nhất để phân tích cú pháp", quan điểm của tôi là cách hiệu quả nhất để phân tích cú pháp là sử dụng trực tiếp saxparser api. – sunkencity