2012-03-30 30 views
11

我是Clojure的新手,我的第一个项目需要处理巨大的(250 + GB)XML文件。我想把它放入PostgreSQL以后再处理,但不知道如何处理这么大的文件。Clojure中的巨大XML

+1

首先了解如何处理小文件,然后处理。 – 2012-03-30 08:57:24

+5

这个XML看起来像什么?高度树木或许多物品的平面集合? – cgrand 2012-03-30 09:26:18

+4

树木 - 伟大的词! +1 – 2012-03-30 11:30:03

回答

18

我使用新的clojure.data.xml在中等笔记本电脑上处理31GB维基百科转储。旧的lazy-xml contrib库不适合我(耗尽内存)。

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

简单的例子代码:

(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指的是什么? clojure io实现lazy-xml被破坏了吗? – 2012-03-30 16:02:02

+0

是的,它有问题。无论如何,它是旧clojure contrib的一部分,并且已被弃用。'data.xml'是替代品。 – 2012-03-30 16:26:07

+0

OK - 我花了几个小时尝试所有((()))可能的组合,但没有成功。我得到StackOverflow错误,它是 - 据我了解 - 因为我使用这个: '(with-open [rdr(BufferedReader。(FileReader。file-name ))'' 并应该使用一些输入流,但我是新来的Clojure和那几个小时后...你能帮忙吗? – trzewiczek 2012-03-30 19:22:19

2

处理巨大的XML通常是用SAX进行,Clojure中的情况下,这是 http://richhickey.github.com/clojure-contrib/lazy-xml-api.html

看到 (解析-seq的文件/的InputStream/URI)

+0

该API可能是懒惰的,但IO不是,所以我怀疑它会在这个大小的文件上工作。 – ivant 2012-03-30 12:25:47

+2

@ivant你将它连接到一个逐步读取数据的输入流。这是在java中处理大型XML文件的标准做法。 – 2012-03-30 13:04:40

+0

请参阅贾斯廷的答案,以解释在这里可能指的是什么。 – 2012-03-30 16:33:22

0

如果XML是一个记录的集合, https://github.com/marktriggs/xml-picker-seq是您需要在xml中处理记录而不考虑xml大小。它在引擎盖下使用XOM,并一次处理一条“记录”。

+0

我也试过,但没有成功。我的意思是 - 它做了一个关于巨大文件的技巧,但是我不能用xpath-query得到结果 - 空结果出来了。唯一可用的xpath查询是“。”,但它不是我想要的......不能管理这个问题超过两个小时...... :( – trzewiczek 2012-03-30 20:39:54

0

您也可以使用大量的文件快报XML解析器(www.expressoxml.com)。它可以解析36GB以上的文件,因为它不受文件大小的限制。它可以从搜索中返回多达230,000个元素,并且可以通过其网站上的“云”进行流式传输。所有开发者版本都是免费的。

+2

尽管您没有试图将此广告伪装为公正的建议,但最好明确说明您与该产品的强烈关联。 https://twitter.com/Lughnasagh/status/260387856772653056。 – 2014-04-24 14:25:59