我正在尝试生成一个序列,它对应于广度优先搜索非常宽、很深的树……当我在序列中走得太远时,我会遇到记忆问题。我在IRC频道上四处打听,并查看了这里,这些问题的头号原因是无意中抓住了头部;但我看不出我是在哪里做的。
代码非常简单;下面是一个显示问题的版本:
(def atoms '(a b c))
(defn get-ch [n] (map #(str n %) atoms))
(defn add-ch
([] (apply concat (iterate add-ch atoms)))
([n] (mapcat get-ch n)))
(dorun (take 20000000 (add-ch)))这里是另一个版本(这是我在从#clojure获得帮助之前开始使用的版本),它显示了相同的问题:
(def atoms '(a b c))
(defn get-children [n] (map #(str n %) atoms))
(defn add-layer
([] (add-layer atoms))
([n] (let [child-nodes (mapcat get-children n) ]
(lazy-seq (concat n (add-layer child-nodes))))))
(dorun (take 20000000 (add-layer)))它们都给了我一个"OutOfMemoryError Java heap space“。我从Eclipse中的REPL /逆时针方向,在Macbook Air上运行它们。
我对Clojure还很陌生,所以经过一天的努力之后,我希望这是我忽略的一些微不足道的东西。我意识到我可以增加我的堆大小来减少问题发生的可能性,但是我最终想要处理的序列是如此之大,我认为这对我没有帮助。
我试着用"drop“代替"take”(在上面的例子中),以避免抓住头部--这没有什么区别。
发布于 2012-06-09 00:23:44
我错过了那个笨蛋。问题似乎出在StringBuilder字符串上。
如果我按如下所示替换get-children,这将起作用:
(defn get-children [n] (map #(if (seq? n) (conj n %) (conj (list n) %)) atoms))https://stackoverflow.com/questions/10947891
复制相似问题