首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免在处理Clojure中的大量序列时耗尽堆内存?

如何避免在处理Clojure中的大量序列时耗尽堆内存?
EN

Stack Overflow用户
提问于 2012-06-08 19:23:45
回答 1查看 653关注 0票数 4

我正在尝试生成一个序列,它对应于广度优先搜索非常宽、很深的树……当我在序列中走得太远时,我会遇到记忆问题。我在IRC频道上四处打听,并查看了这里,这些问题的头号原因是无意中抓住了头部;但我看不出我是在哪里做的。

代码非常简单;下面是一个显示问题的版本:

代码语言:javascript
复制
(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获得帮助之前开始使用的版本),它显示了相同的问题:

代码语言:javascript
复制
(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”(在上面的例子中),以避免抓住头部--这没有什么区别。

EN

回答 1

Stack Overflow用户

发布于 2012-06-09 00:23:44

我错过了那个笨蛋。问题似乎出在StringBuilder字符串上。

如果我按如下所示替换get-children,这将起作用:

代码语言:javascript
复制
 (defn get-children [n] (map #(if (seq? n) (conj n %) (conj (list n) %)) atoms))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10947891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档