【问题标题】:Huge XML in ClojureClojure 中的巨大 XML
【发布时间】:2012-04-13 22:53:32
【问题描述】:

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

【问题讨论】:

  • 从了解如何处理一个小文件开始,然后开始工作。
  • 这个 XML 是什么样的?高度树状或大量物品的扁平集合?

标签: xml clojure


【解决方案1】:

我使用新的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)))

【讨论】:

  • 这就是@ivant 所指的吗?用于lazy-xml 的 clojure io 实现以某种方式被破坏了?
  • 是的,它有问题。无论如何,它是旧 clojure contrib 的一部分,已被弃用。 data.xml 是替代品。
  • OK - 我花了几个小时尝试 ((())) 的所有可能组合,但没有成功。我收到 StackOverflow 错误,它是 - 据我了解 - 因为我使用这个:(with-open [rdr (BufferedReader. (FileReader. file-name))] 并且应该使用一些输入流,但我是 Clojure 的新手,在这几个小时之后......你能帮忙吗?
  • 对不起,我忘了说:我遇到了 StackOverflow 错误,这是由于 Java 中的上游错误造成的。解决方法是使用(data.xml/parse rdr :coalescing false),它目前仅适用于data.xml 的主分支。 0.0.3 版本没有:coalescing 选项。
  • 让这个与维基百科转储一起工作 - 很好。您需要将其包装在 with-opendorun 中,以使其懒惰地处理一个大列表:(with-open [rdr (fn-that-opens-a-reader)] (dorun (->> ...如上...
【解决方案2】:

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

见 (parse-seq File/InputStream/URI)

【讨论】:

  • API 可能是惰性的,但 IO 不是,所以我怀疑它是否适用于那种大小的文件。
  • @ivant 你将它连接到一个增量读取数据的输入流。这是在 java 中处理大型 xml 文件的标准做法。
  • 查看贾斯汀的回答,了解 ivant 在这里可能指的是什么。
【解决方案3】:

如果 xml 是记录的集合,https://github.com/marktriggs/xml-picker-seq 是您需要处理 xml 中的记录,无论 xml 大小如何。它在后台使用 XOM 并一次处理一个“记录”。

【讨论】:

  • 我也试过了,但没有成功。我的意思是 - 它对大文件起到了作用,但我无法通过 xpath-query 得到结果 - 从中​​得出空结果。唯一有效的 xpath 查询是“。”,但这不是我想要的……两个多小时都无法解决这个问题……:(
【解决方案4】:

您还可以使用 expresso XML 解析器来处理大量文件 (www.expressoxml.com)。它可以解析 36GB 及以上的文件,因为它不受文件大小的限制。它可以从搜索中返回多达 230,000 个元素,并且可以通过其网站上的“云”上的流式传输获得。最棒的是他们的开发者版本是免费的。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 2019-02-02
  • 1970-01-01
  • 2018-07-31
  • 2014-07-22
  • 2010-10-29
  • 2014-05-03
相关资源
最近更新 更多