Procesando archivo XML grande con trozo libxml-ruby por trozo

Me gustaría leer un granXML archivo que contiene más de un millón de pequeños registros bibliográficos (como<article>...</article>) utilizando libxml en Ruby. He probado la clase Reader en combinación con elexpand Método para leer registro por registro, pero no estoy seguro de que este sea el enfoque correcto ya que mi código consume memoria. Por lo tanto, estoy buscando una receta sobre cómo procesar convenientemente registro por registro con el uso constante de la memoria. A continuación se muestra mi bucle principal:

   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

La clave aquí es quedblp.expand lee un subárbol completo (como un<article> registro) y lo pasa como un argumento a una fábrica para su posterior procesamiento. ¿Es este el enfoque correcto?

Dentro del método de fábrica, luego uso una expresión similar a XPath de alto nivel para extraer el contenido de los elementos, como a continuación. De nuevo, ¿es esto viable?

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

Respuestas a la pregunta(3)

Su respuesta a la pregunta