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