2012-03-30 12 views
11

Clojure'a yeni geldim ve ilk projemde dev (250 + GB) XML dosyası ile uğraşmak zorundayım. Daha sonra işlemek için PostgreSQL'e koymak istiyorum, ancak böyle büyük bir dosyaya nasıl yaklaşacağımı bilmiyorum. Büyük xml işlemeClojure'da Büyük XML

+1

Küçük bir dosyaya nasıl yaklaşacağınızı anlayarak başlayın, sonra çalışın. –

+5

Bu XML neye benziyor? Çok muboresan veya sayısız öğenin düz bir koleksiyonu? – cgrand

+4

Arborescent - harika kelime! +1 –

cevap

18

Yeni bir dizüstü bilgisayarda 31 GB'lık bir Wikipedia dökümü için yeni clojure.data.xml'u kullandım. Eski lazy-xml katkısı kütüphanesi benim için çalışmadı (bellek bitti).

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

Basitleştirilmiş örnek kod:

(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

, @ivant'ın ne anlama geldiğini? tembel-xml için clojure io uygulama bir şekilde kırık mı? –

+0

Evet, bu sorun var.Ayrıca, eski clojure katkısı bir parçasıdır ve kullanımdan kaldırılmıştır.'. data.xml' değiştirmektir. –

+0

Tamam - Ben birkaç saat çalışarak geçirdim ((()) 'ın olası kombinasyonları, ancak hiçbir başarı olmadan StackOverflow Hatası alıyorum ve anladığım gibi - bunu kullanıyorum: '(açık-açık [rdr (BufferedReader.) (FileReader. dosya-adı)))]] ve bazı giriş akışı kullanmalıyım, fakat ben Clojure için yeni ve bu birkaç saatten sonra ... Yardımcı olabilir misiniz? – trzewiczek

2

genellikle Clojure durumunda, SAX ile yapılır bu http://richhickey.github.com/clojure-contrib/lazy-xml-api.html

bkz olan (ayrıştırmak-seq Dosya/inputStream/URI)

+0

API tembel olabilir, ama IO değil, bu yüzden o boyuttaki bir dosya üzerinde çalışacağından kuşkuluyum. – ivant

+2

@ivant'i, verileri aşamalı olarak okuyan bir giriş akışına bağlarsınız. Java'da büyük xml dosyalarını işlemek için standart bir uygulamadır. –

+0

, ivant'in buraya atıfta bulunabileceği hakkında bir açıklama için Justin'in cevabına bakın. –

0

xml kayıtların bir koleksiyonu ise, https://github.com/marktriggs/xml-picker-seq, xml boyutundan bağımsız olarak xml'de kayıtları işlemek için gerekenler. Başlık altında XOM kullanır ve bir seferde bir 'kayıt' işler.

+0

Bunu da denedim, ancak hiç başarı gösteremedim. Yani - büyük dosya hakkında hile yaptım, ama xpath-query ile reasults alınamıyor - boş sonuçlar ortaya çıkıyor. Çalıştığımız tek xpath sorgusu ".", Ama istediğim şey değil ... Bu problemi iki saatten fazla idare edemedim ... :( – trzewiczek

0

Ayrıca masif dosyalar için espresso XML ayrıştırıcı kullanabilirsiniz (www.expressoxml.com). Dosya boyutuyla sınırlı olmadığı için 36 GB ve üzeri dosyaları ayrıştırabilir. Bir aramadan 230.000 öğeye kadar geri dönebilir ve web sitelerinden "bulut" üzerinden akış yoluyla kullanılabilir. Ve tüm geliştirici sürümlerinin en iyisi ücretsizdir.

+2

Bu ilanı tarafsız bir tavsiye olarak göstermeye çalışmamış olsanız bile, güçlü bir şekilde bu ürünle olan güçlü ilişkinizi belirtmek en iyisidir. https://twitter.com/Lughnasagh/status/260387856772653056. –

İlgili konular