-->

doseq了一个简单的懒惰序列用完了堆空间(doseq over a simple lazy seq

2019-09-21 04:30发布

当压力测试工作的一些Clojure的代码,我注意到它遍历大型数据集时运行的堆空间不足。 我最终设法追查问题回到Clojure的组合doseq功能,并实现FO懒惰序列。

这是基本的代码片段,通过耗尽可用堆空间崩溃的Clojure:

(doseq [e (take 1000000000 (iterate inc 1))] (identity e))

对于文档doseq明确指出它不保留偷懒序列的头,所以我希望上面的代码的存储复杂性将接近O(1)。 是否有什么我失踪? 什么是迭代非常大懒序列的Clojure的,惯用的方式,如果doseq不胜任工作?

Answer 1:

当我运行这个示例中,我看到的内存使用量创下2.0演出所以也许你实际上只是用完内存。

它肯定不会需要一段时间来运行:

user=> (time (doseq [e (take 1000000000 (iterate inc 1))] (identity e)))
"Elapsed time: 266396.221132 msecs"

形成顶:

23999 arthur    20   0 4001m 1.2g 5932 S  213 15.3  17:11.35 java                                          
24017 arthur    20   0 3721m 740m 5548 S   88  9.3  13:49.95 java  


文章来源: doseq over a simple lazy seq runs out of heap space