2017-06-12 6 views
1

私は、関連する関数の1つ以上がmemoizeのヘルプで定義されているデバッグコードです。いくつかのコードを編集し、REPLでファイルをリロードして、新しいコードを試してみましょう。しかし、まだバグが残っている場合は、私はバグを修正していないか、またはmemoizeにバグの結果がキャッシュされているかどうか常に質問します。
したがって、memoizeがメモリを失ったことを絶対に確信させるために使用できるREPLを再起動するのには方法がありませんか?Clojureのmemoizeはいつキャッシュをクリアしますか?

は、(機能のパフォーマンスはメモ化に大きく依存している可能性があるため、REPLセッション中memoizeへの呼び出しを排除することは、退屈な、時には非現実的でもあることに注意してください。)

答えて

3

memoize決して、いかなる状況下でも、そのキャッシュを空にします。その記憶は永久的です。使用する新しい機能がある場合は、元の機能を元に戻してメモ機能を置き換え、古い機能ではなく新しい機能のバージョンのみを使用する必要があります。このようにして、関数呼び出しは新しい基底関数に渡され、古い関数の結果をキャッシュするために使用されるメモリは何も指していないのでガベージコレクションの対象となります。

あなたは言うかもしれませんが、これは痛みです、なぜmemoizeは柔軟性がありません!答えは、memoizeは非常に鈍い楽器であり、ほとんどあらゆるプロダクション用途に適していません。 memoize可能な入力のセットが制限されていない関数の場合はいつでも、メモリリークが発生します。あなたの関数がそのパフォーマンスのためにキャッシュに依存している場合、より柔軟なキャッシュポリシーについては、「すべてを永久にキャッシュする」よりも考えるべきであり、このような用途に合わせて設計されたライブラリを使用してください。

+0

「置き換える」とはどういう意味ですか? –

+1

https://github.com/clojure/core.memoizeはあまり鈍い選択肢ではありません。 – slipset

関連する問題