Verarbeitung großer XML-Dateien mit chunkweise libxml-ruby

Ich würde gerne einen großen lesenXML Datei, die über eine Million kleine Titelsätze enthält (wie<article>...</article>) mit libxml in Ruby. Ich habe die Reader-Klasse in Kombination mit der ausprobiertexpand Methode, um Datensatz für Datensatz zu lesen, aber ich bin nicht sicher, ob dies der richtige Ansatz ist, da mein Code den Speicher auffrisst. Daher suche ich nach einem Rezept, wie man Datensatz für Datensatz bei konstanter Speichernutzung bequem verarbeitet. Unten ist meine Hauptschleife:

   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

Der Schlüssel hier ist dasdblp.expand liest einen ganzen Teilbaum (wie ein<article> record) und übergibt es als Argument zur Weiterverarbeitung an eine Fabrik. Ist das der richtige Ansatz?

Innerhalb der Factory-Methode verwende ich dann einen XPath-ähnlichen Ausdruck auf hoher Ebene, um den Inhalt von Elementen wie unten zu extrahieren. Ist das wieder tragfähig?

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

Antworten auf die Frage(3)

Ihre Antwort auf die Frage