2017-06-12 1 views
1

Dites que je suis le code de débogage où une ou plusieurs des fonctions impliquées est définie à l'aide de memoize. Je vais éditer du code, recharger le fichier dans le REPL, et essayer le nouveau code. Mais si le bug est toujours là, je me demande toujours si c'est parce que je n'ai pas corrigé le bogue ou parce que memoize a mis en cache des résultats buggés.
Alors, est-ce qu'il ya un moyen de redémarrer le REPL que je peux utiliser pour être sûr que memoize a perdu sa mémoire?Quand le mémoize de Clojure efface-t-il son cache?

(Notez que l'élimination des appels à memoize au cours des sessions REPL est à la fois fastidieux et parfois même peu pratique, car les performances de la fonction pourrait appuyer fortement sur memoization.)

Répondre

3

memoize jamais, en aucune circonstance, vide son cache. Son stockage est permanent. Si vous avez une nouvelle fonction que vous souhaitez utiliser, vous devez remplacer votre fonction mémoized en re-mémoizing la fonction sous-jacente, et utilisez uniquement la nouvelle version de la fonction, pas l'ancienne. De cette façon, vos appels de fonction seront transmis à la nouvelle fonction sous-jacente, et la mémoire utilisée pour mettre en cache les résultats de l'ancienne fonction sera éligible pour la récupération de place car rien ne pointe dessus.

Vous pouvez dire, Eh bien, c'est une douleur, pourquoi memoize si inflexible! La réponse est, memoize est un instrument très contondant, pas bien adapté à presque tous les usages de production. Chaque fois que vous memoize une fonction dont l'ensemble des entrées possibles n'est pas limité, vous introduisez une fuite de mémoire. Si votre fonction dépend d'un cache pour ses performances, vous devriez penser davantage à une politique de mise en cache plus flexible que "cache everything forever", et utiliser une bibliothèque conçue pour de tels cas d'utilisation.

+0

Qu'entendez-vous par "remplacer"? –

+1

https://github.com/clojure/core.memoize est une option moins directe. – slipset