【问题标题】:Clojure's lazy-seq cachingClojure 的惰性序列缓存
【发布时间】:2016-02-18 04:56:46
【问题描述】:

Practical Clojure 中,作者提到一旦计算出惰性序列值,它就会被缓存。

如果我们从惰性序列中获得 非常 大量的值,我们是否会看到内存不足错误?或者是否有防止这种情况发生的机制(例如,删除旧的缓存值以为新值腾出空间)?

【问题讨论】:

    标签: caching clojure lazy-sequences


    【解决方案1】:

    惰性序列中的已实现元素能够像 Clojure 中的任何其他对象一样被垃圾收集,但有一个重要的警告。你不应该持有对序列头部的引用。这被称为“抱头”。

    具体而言,使用doall 来评估整个序列,或者在使用map 遍历惰性序列时存储对惰性序列的引用(比如在原子或def 中)都占据了主导地位。

    【讨论】:

    • 想弄清楚这与上述缓存有何协调或关联?
    • 我认为记忆可能是一个比缓存更好的术语。据我所知,实现的 seq 结果永远不会像缓存的结果那样“过期”。如果你不抓住头部,seq头部中的值可能会被GC,因为没有任何东西引用它们。
    猜你喜欢
    • 2011-06-26
    • 2010-12-08
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多