【发布时间】:2012-04-13 22:53:32
【问题描述】:
我是 Clojure 的新手,我的第一个项目必须处理巨大的 (250+GB) XML 文件。我想把它放到 PostgreSQL 中稍后处理,但不知道如何处理这么大的文件。
【问题讨论】:
-
从了解如何处理一个小文件开始,然后开始工作。
-
这个 XML 是什么样的?高度树状或大量物品的扁平集合?
我是 Clojure 的新手,我的第一个项目必须处理巨大的 (250+GB) XML 文件。我想把它放到 PostgreSQL 中稍后处理,但不知道如何处理这么大的文件。
【问题讨论】:
我使用新的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)))
【讨论】:
data.xml 是替代品。
(with-open [rdr (BufferedReader. (FileReader. file-name))] 并且应该使用一些输入流,但我是 Clojure 的新手,在这几个小时之后......你能帮忙吗?
(data.xml/parse rdr :coalescing false),它目前仅适用于data.xml 的主分支。 0.0.3 版本没有:coalescing 选项。
with-open 和 dorun 中,以使其懒惰地处理一个大列表:(with-open [rdr (fn-that-opens-a-reader)] (dorun (->> ...如上...
处理巨大的 xml 通常是用 SAX 完成的,在 Clojure 的情况下,这是 http://richhickey.github.com/clojure-contrib/lazy-xml-api.html
见 (parse-seq File/InputStream/URI)
【讨论】:
如果 xml 是记录的集合,https://github.com/marktriggs/xml-picker-seq 是您需要处理 xml 中的记录,无论 xml 大小如何。它在后台使用 XOM 并一次处理一个“记录”。
【讨论】:
您还可以使用 expresso XML 解析器来处理大量文件 (www.expressoxml.com)。它可以解析 36GB 及以上的文件,因为它不受文件大小的限制。它可以从搜索中返回多达 230,000 个元素,并且可以通过其网站上的“云”上的流式传输获得。最棒的是他们的开发者版本是免费的。
【讨论】: