请在 2024 Clojure 状况调查! 中分享您的想法。

欢迎!请参阅 关于 页面了解有关此工作的更多信息。

0
Clojure

你好!

这个小代码片段演示了问题

(doseq [outer-seq (list (range)) inner-seq outer-seq])

就是这样。它不仅消耗了我的处理器,还消耗了所有可用内存。实际上,它可能影响(并且确实这样做)复杂惰性结构(如大型 XML 文档)的消耗。

我认为这是一个至少非平凡的行为了。

可以通过这个小补丁来修复它。我们可以在当前迭代之前获取下一个元素,而不是之后,这样外部循环就不会保留对内部序列头部的引用。

这个补丁并没有解决所有问题,例如,以下代码会泄漏:

(doseq [outer-seq [(range)] inner-seq outer-seq])

泄漏的原因在于分块序列(在此为向量)会根据设计保留当前元素。

2 个答案

0

评论者:jafingerhut

安德鲁,很抱歉,但我不知道这个票据是否对 Clojure 核心团队有意义。

我知道,只有提交者签署了贡献者协议(CA),补丁才会被考虑包含在 Clojure 中。如果您有兴趣这样做,您可以在这里在线迅速完成: https://clojure.org/contributing

0
参考资料: https://clojure.atlassian.net/browse/CLJ-1595(由 alex+import 报告)
...