【问题标题】:When does Clojure's memoize clear its cache?Clojure 的 memoize 什么时候清除它的缓存?
【发布时间】:2017-06-12 22:54:47
【问题描述】:

假设我正在调试代码,其中涉及的一个或多个函数是在memoize 的帮助下定义的。我将编辑一些代码,在 REPL 中重新加载文件,然后尝试新代码。但是如果错误仍然存​​在,我总是会怀疑是因为我没有修复错误还是因为memoize 缓存了错误结果。
那么,有没有什么办法可以重新启动 REPL 以确保 memoize 已失去记忆?

(请注意,在 REPL 会话期间消除对 memoize 的调用既乏味,有时甚至不切实际,因为函数的性能可能严重依赖于记忆。)

【问题讨论】:

    标签: clojure read-eval-print-loop memoization


    【解决方案1】:

    memoize 在任何情况下都不会清空其缓存。它的存储是永久的。如果你想使用一个新函数,你必须通过重新记忆底层函数来替换你记忆的函数,并且只使用新版本的函数,而不是旧版本。这样,您的函数调用将传递给新的底层函数,并且用于缓存旧函数结果的内存将成为垃圾回收的条件,因为没有任何指向它。

    你可能会说,天哪,这很痛苦,为什么memoize 这么不灵活!答案是,memoize 是一种非常生硬的工具,几乎不适合任何生产用途。任何时候你 memoize 一个可能的输入集不受限制的函数,你都会引入内存泄漏。如果您的函数的性能依赖于缓存,那么您应该考虑更多比“永远缓存所有内容”更灵活的缓存策略,并使用专为此类用例设计的库。

    【讨论】:

    • “替换”是什么意思?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 2013-03-20
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    相关资源
    最近更新 更多