У меня есть xml файл размером 1.6gb, и когда я разбираю его с помощью Sax Machine, он не кажется потоковым или съедающим файл по частям - скорее кажется, что он загружает весь файл в память (или, может быть, где-то есть утечка памяти?), потому что мой процесс ruby поднимается до 2.5gb ram. Я не знаю, где он перестает расти, потому что у меня закончилась память.
На меньшем файле (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
Как вы видите, меня не волнует элемент
в ленте. Мне нужны только атрибуты каждого элемента <списка>
.
Вывод выглядит так:
Parsing
... wait forever
Importing (actually, I don't ever see this on the big file (1.6gb) because too much memory is used :(