2012-03-30 11 views
11

Ich bin neu in Clojure und mein erstes Projekt hat mit riesigen (250 + GB) XML-Datei zu tun. Ich möchte es in PostgreSQL einfügen, um es später zu verarbeiten, aber ich habe keine Ahnung, wie ich mich einer so großen Datei nähern soll.Riesige XML in Clojure

+1

Fangen Sie an zu verstehen, wie Sie sich einer kleinen Datei nähern und arbeiten Sie dann weiter. –

+5

Wie sieht dieses XML aus? Stark baumartig oder eine flache Sammlung von zahlreichen Gegenständen? – cgrand

+4

Arborescent - tolles Wort! +1 –

Antwort

18

Ich benutzte die neue clojure.data.xml, um eine 31GB Wikipedia-Dump auf einem bescheidenen Laptop zu verarbeiten. Die alte lazy-xml contrib-Bibliothek funktionierte nicht für mich (kein Speicher mehr).

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

Simplified Beispielcode:

(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

also ist dies das, worauf sich @ivant bezieht? clojure io Implementierung für lazy-xml ist irgendwie kaputt? –

+0

Ja, es hat Probleme. Unabhängig davon, es ist Teil der alten clojure contrib und ist veraltet. 'data.xml 'ist der Ersatz. –

+0

OK - Ich verbrachte ein paar Stunden, die alle versuchen mögliche Kombinationen von ((())), aber ohne Erfolg Ich bekomme den StackOverflow Error und es ist - wie ich es verstehe - weil ich folgendes verwende: ' ' (with-open [rdr (BufferedReader. (FileReader. dateiname)]] '' und sollte einige Eingabe-Stream verwenden, aber ich bin neu in Clojure und nach diesen paar Stunden ... Könnten Sie helfen? – trzewiczek

2

großen XML-Verarbeitung wird in der Regel mit SAX getan, bei Clojure ist dies http://richhickey.github.com/clojure-contrib/lazy-xml-api.html

siehe (parsen-Seq Datei/Input/URI)

+0

Die API kann faul sein, aber IO ist nicht, also bezweifle ich, dass es bei einer Datei dieser Größe funktionieren würde. – ivant

+2

@ivant Sie verbinden es mit einem Eingabestrom, der Daten inkrementell liest. Es ist üblich, große XML-Dateien in Java zu verarbeiten. –

+0

siehe Justins Antwort für eine Erklärung, worauf sich Ivant hier bezieht. –

0

Wenn die xml eine Sammlung von Datensätzen ist, https://github.com/marktriggs/xml-picker-seq ist, was Sie Datensätze unabhängig von der XML-Größe in XML verarbeiten müssen. Es verwendet XOM unter der Haube und verarbeitet jeweils einen "Datensatz".

+0

Ich habe das auch versucht, aber ohne Erfolg. Ich meine - es hat den Trick mit der riesigen Datei gemacht, aber ich kann die Ergebnisse mit xpath-Abfrage nicht bekommen - leere Ergebnisse kommen heraus. Die einzige xpath-Abfrage, die funktioniert, ist ".", Aber es ist nicht das, was ich wollte ... Konnte dieses Problem für mehr als zwei Stunden nicht verwalten ... :( – trzewiczek

0

Sie können auch Expresso XML-Parser für massive Dateien verwenden (www.expressoxml.com). Es kann Dateien von 36 GB und mehr analysieren, da es nicht durch die Dateigröße begrenzt ist. Es kann bis zu 230.000 Elemente aus einer Suche zurückgeben und ist über Streaming über die "Cloud" von ihrer Website verfügbar. Und am besten ist ihre Entwicklerversion kostenlos.

+2

Obwohl Sie nicht versucht haben, diese Anzeige als unparteiischen Rat zu tarnen, ist es am besten, Ihre starke Zugehörigkeit zu diesem Produkt anzugeben. https://twitter.com/Lughnasagh/status/260387856772653056. –