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