你好!
这个小片段展示了这个问题
(doseq [outer-seq (list (range)) inner-seq outer-seq])
就是这样。这个操作不仅耗尽我的处理器,还耗尽所有可用的内存。在实践中,它可能影响(实际上正在影响)消耗复杂延迟结构,如巨大的XML文档。
我认为这是一个至少非常明显的行为。
可以通过这个小补丁来解决这个问题。我们在当前迭代之前获得下一个元素,而不是之后,这样外循环就不会持有inner-seq的头部引用。
这个补丁并没有解决所有问题,例如,以下代码
(doseq [outer-seq [(range)] inner-seq outer-seq])
会泄漏。因为chunked-seqs(在这个例子中是向量)根据设计保留当前元素。