Парсинг большого файла с помощью SaxMachine, кажется, загружает весь файл в память

У меня есть 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 :(
5
задан jakeonrails 9 February 2012 в 00:49
поделиться