2012-03-30 13 views
11

Soy nuevo en Clojure y mi primer proyecto tiene que ver con un gran archivo XML (250 + GB). Quiero ponerlo en PostgreSQL para procesarlo más adelante, pero no tengo idea de cómo acercarme a un archivo tan grande.Enorme XML en Clojure

+1

Comience por comprender cómo acercarse a un archivo pequeño, luego realice una búsqueda. –

+5

¿Cómo es esta XML? Altamente arborescente o una colección plana de numerosos artículos? – cgrand

+4

Arborescente - gran palabra! +1 –

Respuesta

18

Utilicé el nuevo clojure.data.xml para procesar un volcado de Wikipedia de 31GB en una modesta computadora portátil. La antigua biblioteca contrib lazy-xml no funcionó para mí (se quedó sin memoria).

https://github.com/clojure/data.xml

simplificado código de ejemplo:

(require '[clojure.data.xml :as data.xml]) ;' 

(defn process-page [page] 
    ;; ... 
) 

(defn page-seq [rdr] 
    (->> (:content (data.xml/parse rdr)) 
     (filter #(= :page (:tag %))) 
     (map process-page))) 
+0

, ¿a esto se refiere @ivant? La implementación de clojure io para lazy-xml se ha roto de alguna manera? –

+0

Sí, tiene problemas. A pesar de todo, es parte del antiguo contributor clojure y está en desuso. 'data.xml' es el reemplazo. –

+0

OK - Pasé unas horas intentando todo posibles combinaciones de ((())) pero sin éxito. Obtengo el error StackOverflow y es, como yo lo entiendo, porque uso esto: '(with-open [rdr (BufferedReader. (FileReader. file-name))] ' y debería usar algún flujo de entrada, pero soy nuevo en Clojure y después de esas pocas horas ... ¿Podría ayudarme? – trzewiczek

2

procesamiento enorme xml se hace generalmente con SAX, en caso de Clojure esto es http://richhickey.github.com/clojure-contrib/lazy-xml-api.html

ver (analizar-ss Archivo/InputStream/URI)

+0

La API puede ser floja, pero IO no lo es, así que dudo que funcione en un archivo de ese tamaño. – ivant

+2

@ivant lo conecta a un flujo de entrada que lee datos de forma incremental. es una práctica estándar para procesar grandes archivos xml en Java. –

+0

vea la respuesta de Justin para obtener una explicación de a qué se refiere el comentario. –

0

Si el XML es un conjunto de registros, https://github.com/marktriggs/xml-picker-seq es lo que necesita para procesar registros en xml independientemente del tamaño xml. Utiliza XOM bajo el capó y procesa un 'registro' a la vez.

+0

Lo intenté también, pero sin éxito. Quiero decir que funcionó el truco sobre el gran archivo, pero no puedo obtener los comentarios con xpath-query, los resultados vacíos salen de él. La única consulta xpath que funciona es ".", Pero no es lo que yo quería ... No se pudo solucionar este problema durante más de dos horas ... :( – trzewiczek

0

También puede utilizar analizador XML expresso para archivos grandes (www.expressoxml.com). Puede analizar archivos de 36 GB y más, ya que no está limitado por el tamaño del archivo. Puede devolver hasta 230,000 elementos de una búsqueda y está disponible a través de la transmisión por la "nube" desde su sitio web. Y lo mejor de todo es que su versión de desarrollador es gratuita.

+2

Aunque no haya tratado de disfrazar este anuncio como un consejo imparcial, es mejor indicar explícitamente su fuerte afiliación con ese producto. https://twitter.com/Lughnasagh/status/260387856772653056. –