Xml 反恐执行局。为了答案的完整性,也许您可以添加一些代码来实际重建完整的树。我通过(defn运行[size](让[root builder(root'(level-1'(level-2'size)))更新内容(fn[f节点)(在节点[:content]f]中更
Xml 反恐执行局。为了答案的完整性,也许您可以添加一些代码来实际重建完整的树。我通过(defn运行[size](让[root builder(root'(level-1'(level-2'size)))更新内容(fn[f节点)(在节点[:content]f]中更,xml,clojure,tree,lazy-evaluation,Xml,Clojure,Tree,Lazy Evaluation,反恐执行局。为了答案的完整性,也许您可以添加一些代码来实际重建完整的树。我通过(defn运行[size](让[root builder(root'(level-1'(level-2'size)))更新内容(fn[f节点)(在节点[:content]f]中更新))(>(root builder)(在[:content]中更新)(映射(部分更新内容删除节点)%))))我将调查为什么我得到的XML数据不能使用此方法。可能是data.xml添加到数据结构中的内容。因此,您可能遇到的新问题是,对于我所知道
反恐执行局。为了答案的完整性,也许您可以添加一些代码来实际重建完整的树。我通过
(defn运行[size](让[root builder(root'(level-1'(level-2'size)))更新内容(fn[f节点)(在节点[:content]f]中更新))(>(root builder)(在[:content]中更新)(映射(部分更新内容删除节点)%))))
我将调查为什么我得到的XML数据不能使用此方法。可能是data.xml
添加到数据结构中的内容。因此,您可能遇到的新问题是,对于我所知道的任何懒惰模型,读取xml流并生成“懒惰树”都是非常困难的。很难真正了解c.d.xml内部的情况:它声称是懒惰的,也许这取决于“懒惰”的含义,但我建议仔细检查一下。由于您有一个很大的XML文件,请尝试使用(defn walk[tree](when(coll?tree)(doseq[x tree](walk x)))
遍历整个文件,看看这是否会耗尽您的内存。@nblumoe我刚刚下载了一个700MB的XML文件,并尝试了(walk(XML/parse(reader the file)))。如果这实际上是一个懒惰的树,它将在恒定的空间中运行,并最终输出nil。取而代之的是,它消耗了我的系统中的所有内存,将整棵树固定在适当的位置。如果您想懒洋洋地处理XML,您可能必须自己处理SAX事件流,而不是让其他人为您将其整理成一棵树。
R Root
__________|____________________
A B C, D, E, ... 1st Level Children
_______|_______ _______|_______
X Y Y ... Y X Y X Y Y ... Y X Y 2nd Level Children
R
______|__________________
A B C, D, E, ...
_____|___ _____|___
X X ... X X X ... X
;; Generating example data
;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn root [content]
{:tag :root :content content})
(defn lazy-elements [n tag content]
(lazy-seq (repeat n {:tag tag :content content})))
(defn level-1 [content]
(lazy-elements 3 :A content))
(defn level-2 [n]
(concat (lazy-elements 10 :X '(:leaf))
(lazy-elements n :Y '(:leaf))))
(defn remove-nodes [node]
(remove #(= (:tag %) :Y) node))
;; Illustrating usage
;;;;;;;;;;;;;;;;;;;;;
;; runs and runs and runs... and eventually returns correctly
(defn valid-run []
(->> (root (level-1 (level-2 1e8)))
:content
first
:content
remove-nodes))
;; Does not terminate properly, runs out of memory
(defn invalid-run []
(->> (root (level-1 (level-2 1e8)))
:content
(map :content) ; source of head retention
(map remove-nodes)))
(defn root' [content]
(fn []
{:tag :root :content (content)}))
(defn lazy-elements' [n tag content]
(repeatedly n (fn [] {:tag tag :content (content)})))
(defn level-1' [content]
(fn []
(lazy-elements' 3 :A content)))
(defn level-2' [n]
(fn []
(concat (lazy-elements' 10 :X (fn [] '(:leaf)))
(lazy-elements' n :Y (fn [] '(:leaf))))))
(defn remove-nodes [node]
(remove #(= (:tag %) :Y) node))
(defn run []
(let [root-builder (root' (level-1' (level-2' 1e8)))]
(->> (root-builder)
:content
(map :content)
(map remove-nodes))))
user> (pprint (run))
(({:tag :X, :content (:leaf)}
{:tag :X, :content (:leaf)}
{:tag :X, :content (:leaf)}
{:tag :X, :content (:leaf)}
{:tag :X, :content (:leaf)}
{:tag :X, :content (:leaf)}
{:tag :X, :content (:leaf)}
{:tag :X, :content (:leaf)}
{:tag :X, :content (:leaf)}
{:tag :X, :content (:leaf)})
({:tag :X, :content (:leaf)}
{:tag :X, :content (:leaf)}
{:tag :X, :content (:leaf)}
{:tag :X, :content (:leaf)}
{:tag :X, :content (:leaf)}
{:tag :X, :content (:leaf)}
{:tag :X, :content (:leaf)}
{:tag :X, :content (:leaf)}
{:tag :X, :content (:leaf)}
{:tag :X, :content (:leaf)})
({:tag :X, :content (:leaf)}
{:tag :X, :content (:leaf)}
{:tag :X, :content (:leaf)}
{:tag :X, :content (:leaf)}
{:tag :X, :content (:leaf)}
{:tag :X, :content (:leaf)}
{:tag :X, :content (:leaf)}
{:tag :X, :content (:leaf)}
{:tag :X, :content (:leaf)}
{:tag :X, :content (:leaf)}))