我需要在ruby中解析一个大的(4gb)xml文件,最好用nokogiri。我看过很多使用
的代码File.open(path)
但这需要花费太多时间。是否有选项可以按节点读取xml节点,以防止将文件加载到1。或者解析这么大的文件的最快方法是什么。 最好, 菲尔
答案 0 :(得分:2)
您可以尝试使用Nokogiri::XML::SAX
SAX样式解析器的基本工作方式是创建解析器, 告诉解析器我们感兴趣的事件,然后给予 解析器需要处理一些XML。解析器会在何时通知您 遇到你说你想知道的事件。
答案 1 :(得分:1)
我使用LibXML http://xml4r.github.io/libxml-ruby/(require 'xml'
)及其LibXML :: XML :: Reader API进行此类工作。它比SAX简单,让你几乎可以做任何事情。 REXML也包含类似的API,但它有很多错误。像我提到的那样的流API或SAX不应该对大文件有任何问题。我没有测试Nokogiri。
答案 2 :(得分:0)
您可以尝试一下 - https://github.com/amolpujari/reading-huge-xml
(defnz z y
[{:keys [value] :as args}]
(println "Z ARGS" args)
(println "Z VALUE" value))
;;(defn z [{:keys [value], :as args}]
;; (do (y args) (println "Z ARGS" args) (println "Z VALUE" value)))
(defnz z y
[{:keys [value] :as all-args}]
(println "Z ARGS" all-args)
(println "Z VALUE" value))
;;(defn z [{:keys [value], :as all-args}]
;; (do
;; (y all-args)
;; (println "Z ARGS" all-args)
;; (println "Z VALUE" value)))
(defnz z y
[{:keys [value]}]
(println "Z ARGS" everything)
(println "Z VALUE" value))
;;(defn z [{:keys [value], :as everything}]
;; (do
;; (y everything)
;; (println "Z ARGS" everything)
;; (println "Z VALUE" value)))
我也尝试过使用ox