Clojure错误-使用具有惰性序列的减速器超出了GC开销限制

Clojure错误-使用具有惰性序列的减速器超出了GC开销限制,clojure,sequence,lazy-evaluation,garbage,collect,Clojure,Sequence,Lazy Evaluation,Garbage,Collect,我得到: 地图:500000000005000000000N “运行时间:8540888.550507毫秒” 我得到: 线程“main”java.lang.OutOfMemoryError中出现异常:超出GC开销限制,正在编译:。。。 原因:java.lang.OutOfMemoryError:超出GC开销限制 ; Test 2 - Using Map Reducer (Creates GC Error) (ns example (:gen-class)) (require '[clo

我得到: 地图:500000000005000000000N “运行时间:8540888.550507毫秒”

我得到: 线程“main”java.lang.OutOfMemoryError中出现异常:超出GC开销限制,正在编译:。。。 原因:java.lang.OutOfMemoryError:超出GC开销限制

; Test 2 - Using Map Reducer (Creates GC Error)
(ns example
     (:gen-class))
(require '[clojure.core.reducers :as r])

(def n 100000000000)
(time (println  "rmap: " (reduce + 0N (r/map inc (range n)))))
我得到: 线程“main”java.lang.OutOfMemoryError中出现异常:超出GC开销限制,正在编译:。。。 原因:java.lang.OutOfMemoryError:超出GC开销限制

; Test 2 - Using Map Reducer (Creates GC Error)
(ns example
     (:gen-class))
(require '[clojure.core.reducers :as r])

(def n 100000000000)
(time (println  "rmap: " (reduce + 0N (r/map inc (range n)))))
本应期望这三者都能产生相同的结果。相反,只有#1起作用,但其他两个有GC问题


注意:您可以使用较小的n值使这三个函数都工作。

我在VisualVM中快速分析了这一点。在reducers的情况下,堆很快就会被数百万个对象填满。从远处看,这似乎是由
远程
中的分块代码造成的,它确定并缓存“下一个”分块(也是
远程
)。我有一种感觉,Clojure开发者自己可能想看看这一点。这方面还有一个有待解决的问题:感谢glts和Alan的反馈。
; Test 3 - Using Reducer with Fold (Creates GC Error)
(ns example
  (:gen-class))
(require '[clojure.core.reducers :as r])

(def n 100000000000)
(time (println "fold: " (r/fold + (r/map inc (range n)))))