У меня есть xml-файл 1.6 ГБ, и когда я анализирую его с помощью Sax Machine, он, кажется, не передает и не загружает файл в виде фрагментов - скорее он загружает весь файл в память (или, возможно, утечка памяти где-нибудь?), потому что мой процесс ruby поднимается выше 2,5 ГБ ОЗУ Я не знаю, где он перестает расти, потому что у меня закончилась память.
Для файла меньшего размера (50 МБ) он также загружает весь файл. Моя задача перебирает записи в файле xml и сохраняет каждую запись в базе данных. Требуется около 30 секунд «холостого хода», а затем внезапно начинают выполняться запросы к базе данных.
Я думал, что SAX должен был позволить вам работать с такими большими файлами, не загружая все это в память.
Есть что-то, что я пропускаю?
Большое спасибо
Обновление для добавления образца кода
class FeedImporter
class FeedListing
include ::SAXMachine
element :id
element :title
element :description
element :url
def to_hash
{}.tap do |hash|
self.class.column_names.each do |key|
hash[key] = send(key)
end
end
end
end
class Feed
include ::SAXMachine
elements :listing, :as => :listings, :class => FeedListing
end
def perform
open('~/feeds/large_feed.xml') do |file|
# I think that SAXMachine is trying to load All of the listing elements into this one ruby object.
puts 'Parsing'
feed = Feed.parse(file)
# We are now iterating over each of the listing elements, but they have been "parsed" from the feed already.
puts 'Importing'
feed.listings.each do |listing|
Listing.import(listing.to_hash)
end
end
end
end
Как видите, меня не волнует элемент <listings>
в ленте. Я просто хочу атрибуты каждого элемента <listing>
.
Вывод выглядит так:
Parsing
... wait forever
Importing (actually, I don't ever see this on the big file (1.6gb) because too much memory is used :(