当压力测试工作的一些Clojure的代码,我注意到它遍历大型数据集时运行的堆空间不足。 我最终设法追查问题回到Clojure的组合doseq
功能,并实现FO懒惰序列。
这是基本的代码片段,通过耗尽可用堆空间崩溃的Clojure:
(doseq [e (take 1000000000 (iterate inc 1))] (identity e))
对于文档doseq
明确指出它不保留偷懒序列的头,所以我希望上面的代码的存储复杂性将接近O(1)。 是否有什么我失踪? 什么是迭代非常大懒序列的Clojure的,惯用的方式,如果doseq
不胜任工作?