Clojure 的 memoize 何时清除其缓存?

Seb*_*off 2 clojure memoization read-eval-print-loop

假设我正在调试代码,其中涉及的一个或多个函数是在memoize. 我将编辑一些代码,在 REPL 中重新加载文件,然后尝试新代码。但如果错误仍然存​​在,我总是怀疑是因为我还没有修复错误还是因为memoize缓存了错误结果。
那么,除了重新启动 REPL 之外,是否有某种方法可以用来绝对确保 REPL 已memoize丢失内存?

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

ama*_*loy 5

memoize在任何情况下都不会清空其缓存。它的存储是永久的。如果您希望使用一个新函数,则必须通过重新记忆底层函数来替换您记忆的函数,并且仅使用该函数的新版本,而不是旧版本。这样,您的函数调用将传递到新的底层函数,并且用于缓存旧函数结果的内存将有资格进行垃圾回收,因为没有任何东西指向它。

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