2017-06-12 87 views
1

說我正在調試代碼,其中涉及的一個或多個功能是在memoize的幫助下定義的。我將編輯一些代碼,在REPL中重新加載文件,然後嘗試新的代碼。但是如果這個bug仍然存在,我總是會質疑是否因爲我沒有修復這個bug,或者因爲memoize緩存了錯誤結果。
那麼,有沒有什麼方法可以重新啓動REPL,我可以用它來確保memoize已經失去了內存?Clojure的記憶什麼時候清除緩存?

(請注意,在REPL會話消除了memoize電話既繁瑣,有時甚至是不現實的,因爲功能的性能可能在很大程度上依賴於記憶化。)

回答

3

memoize從來沒有,在任何情況下,清空緩存。它的存儲是永久的。如果你有一個你想使用的新函數,你必須通過重新記憶底層函數來替換你的memoized函數,並且只使用新版本的函數,而不是舊函數。這樣,函數調用將被傳遞到新的底層函數,並且用於緩存舊函數結果的內存將成爲垃圾收集的條件,因爲沒有指向它的地方。

你可能會說,那麼天哪,這是一個痛苦,爲什麼memoize如此僵化!答案是,memoize是一個非常鈍的工具,不適合幾乎任何生產用途。任何時候你都可以輸入一組可能的輸入不受限制的函數,你會引入一個內存泄漏。如果你的函數依賴於高速緩存的性能,那麼你應該考慮一個更靈活的緩存策略,而不是「永遠緩存所有內容」,並且使用爲這種用例設計的庫。

+0

你是什麼意思的「替換」? –

+1

https://github.com/clojure/core.memoize是一個不太直白的選項。 – slipset