假设我正在调试代码,其中涉及的一个或多个函数是在memoize
的帮助下定义的。我将编辑一些代码,在REPL中重新加载文件,然后尝试新代码。但如果错误仍然存在,我总是质疑是否因为我没有修复错误,或者因为memoize
缓存了错误的结果。
那么,是否有一些方法可以重新启动REPL,我可以用来确保memoize
已经丢失了内存?
(请注意,在REPL会话期间取消对memoize
的调用既繁琐又有时甚至不实用,因为函数的性能可能在很大程度上依赖于memoization。)
答案 0 :(得分:4)
memoize
都不会清空其缓存。它的存储是永久性的。如果您有一个想要使用的新函数,则必须通过重新记忆基础函数来替换您的memoized函数,并且只使用函数的新版本,而不是旧版本。这样,你的函数调用将被传递给新的底层函数,用于缓存旧函数结果的内存将有资格进行垃圾收集,因为没有任何指向它。
你可能会说,天哪,这是一种痛苦,为什么memoize
如此不灵活!答案是,memoize
是一种非常钝的工具,几乎不适合任何生产用途。只要您memoize
一个可能的输入集不受限制的函数,就会引入内存泄漏。如果您的函数依赖于缓存的性能,您应该考虑更多灵活的缓存策略,而不是“永远缓存所有内容”,并使用专为此类用例设计的库。