Clojure的memoize什么时候清除它的缓存?

时间:2017-06-12 22:54:47

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

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

(请注意,在REPL会话期间取消对memoize的调用既繁琐又有时甚至不实用,因为函数的性能可能在很大程度上依赖于memoization。)

1 个答案:

答案 0 :(得分:4)

在任何情况下,

memoize都不会清空其缓存。它的存储是永久性的。如果您有一个想要使用的新函数,则必须通过重新记忆基础函数来替换您的memoized函数,并且只使用函数的新版本,而不是旧版本。这样,你的函数调用将被传递给新的底层函数,用于缓存旧函数结果的内存将有资格进行垃圾收集,因为没有任何指向它。

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