Обработка большого XML-файла с помощью фрагмента libxml-ruby

Я хотел бы прочитать большойXML файл, который содержит более миллиона небольших библиографических записей (например,<article>...</article>) используя libxml в Ruby. Я пробовал класс Reader в сочетании сexpand метод чтения записи по записи, но я не уверен, что это правильный подход, так как мой код потребляет память. Следовательно, я ищу рецепт, как удобно обрабатывать записи по записи с постоянным использованием памяти. Ниже мой основной цикл:

   File.open('dblp.xml') do |io|
      dblp = XML::Reader.io(io, :options => XML::Reader::SUBST_ENTITIES)
      pubFactory = PubFactory.new

      i = 0
      while dblp.read do
        case dblp.name
          when 'article', 'inproceedings', 'book': 
            pub = pubFactory.create(dblp.expand)
            i += 1
            puts pub
            pub = nil
            $stderr.puts i if i % 10000 == 0
            dblp.next
          when 'proceedings','incollection', 'phdthesis', 'mastersthesis':
            # ignore for now
            dblp.next 
          else
            # nothing
        end
      end  
    end

Ключевым моментом здесь является то, чтоdblp.expand читает целое поддерево (как<article> запись) и передает его в качестве аргумента фабрике для дальнейшей обработки. Это правильный подход?

Внутри фабричного метода я затем использую высокоуровневое XPath-подобное выражение для извлечения содержимого элементов, как показано ниже. Опять же, это жизнеспособно?

def first(root, node)
    x = root.find(node).first
    x ? x.content : nil
end

pub.pages   = first(node,'pages') # node contains expanded node from dblp.expand

Ответы на вопрос(3)

Ваш ответ на вопрос