2012-03-30 11 views
11

Sono nuovo di Clojure e il mio primo progetto ha a che fare con un enorme file XML (250 + GB). Voglio metterlo in PostgreSQL per elaborarlo in seguito, ma non ho idea di come affrontare un file così grande.Enorme XML in Clojure

+1

Inizia comprendendo come avvicinarsi a un file piccolo, quindi lavorare. –

+5

Che aspetto ha questo XML? Collezione altamente arborescente o piatta di numerosi articoli? – cgrand

+4

Arborescent - ottima parola! +1 –

risposta

18

Ho utilizzato il nuovo clojure.data.xml per elaborare un dump di Wikipedia da 31 GB su un laptop modesto. La vecchia libreria contrib lazy-xml non ha funzionato per me (esaurito la memoria).

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

semplificato codice di esempio:

(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

quindi questo è ciò a cui @ivant si riferisce? l'implementazione di clojure io per lazy-xml è in qualche modo rotta? –

+0

Sì, ha problemi .Inoltre, fa parte del vecchio contributo di clojure ed è deprecato. "data.xml' è la sostituzione. –

+0

OK - Ho passato qualche ora a provare tutto Possibili combinazioni di ((())) ma senza successo Ottengo l'errore StackOverflow ed è - a quanto ho capito - perché io uso questo: '(with-open [rdr (BufferedReader. (FileReader.)) e dovrebbe usare qualche flusso di input, ma sono nuovo di Clojure e dopo quelle poche ore ... Potresti aiutarmi? – trzewiczek

2

elaborazione enorme XML di solito è fatto con SAX, in caso di Clojure questo è http://richhickey.github.com/clojure-contrib/lazy-xml-api.html

vedere (analizzare-ss File/InputStream/URI)

+0

L'API può essere pigra, ma IO non lo è, quindi dubito che funzioni su un file di quelle dimensioni. – ivant

+2

@ivant lo colleghi a un flusso di input che legge i dati in modo incrementale. è una pratica standard per l'elaborazione di file xml di grandi dimensioni in java. –

+0

vedi la risposta di Justin per una spiegazione di cosa può riferirsi qui. –

0

Se l'XML è un insieme di record, https://github.com/marktriggs/xml-picker-seq è ciò che è necessario per elaborare i record in xml indipendentemente dalla dimensione xml. Usa XOM sotto il cofano e processa un 'record' alla volta.

+0

Ho provato anche quello, ma senza successo. Voglio dire - ha fatto il trucco dell'enorme file, ma non riesco a ottenere i reasult con xpath-query - ne escono risultati vuoti. L'unica query xpath che funziona è ".", Ma non è quello che volevo ... Non riuscivo a gestire questo problema per più di due ore ... :( – trzewiczek

0

È inoltre possibile utilizzare parser XML espresso per file di grandi dimensioni (www.expressoxml.com). Può analizzare file da 36 GB o più in quanto non è limitato dalle dimensioni del file. Può restituire fino a 230.000 elementi da una ricerca ed è disponibile tramite streaming sul "cloud" dal loro sito web. E soprattutto la loro versione per sviluppatori è gratuita.

+2

Anche se non hai provato a mascherare questo annuncio come un consiglio imparziale, è meglio indicare esplicitamente la tua forte affiliazione con quel prodotto. https://twitter.com/Lughnasagh/status/260387856772653056. –