gpt4 book ai didi

memory - 在 Clojure 中处理大量序列时,如何避免堆内存不足?

转载 作者:行者123 更新时间:2023-12-01 04:03:51 25 4
gpt4 key购买 nike

我正在尝试生成一个序列,该序列对应于对非常宽、深的树的广度优先搜索......当我沿着序列走得太远时,我遇到了内存问题。在IRC channel 上四处打听,看这里,造成此类问题的第一大原因是不经意间抱住了头;但我看不到我在哪里这样做。

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

(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 堆空间”。我正在 Macbook Air 上从 Eclipse/CounterClockwise 中的 REPL 运行它们。

我对 Clojure 还很陌生,所以在与它搏斗了一天之后,我希望这是我忽略的一些微不足道的东西。我意识到我可以增加我的堆大小来减少问题发生的可能性,但是我最终想要处理的序列是如此之大,我认为这对我没有帮助。

我试过用“drop”替换“take”(在上面的例子中),以避免保持头部 - 这没有区别。

最佳答案

我错过了dorun。
问题似乎出在 StringBuilder str 上。

如果我按如下方式替换 get-children ,这会起作用:

 (defn get-children [n] (map #(if (seq? n) (conj n %) (conj (list n) %)) atoms))

关于memory - 在 Clojure 中处理大量序列时,如何避免堆内存不足?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10947891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com