Comment implémenter un cache LRU avec Erlang?Erlang LRU Cache
Top joué projet Github était fogfish/cache, mais le tableau segmentée était pas tout à fait pour mes données.
barrel-db/erlang-lru utilisait une liste. après le test, il serait lent s'il y avait trop de données.
Je suppose que le problème était ici.
move_front(List, Key) -> [Key | lists:delete(Key, List)].
Avec Java, une meilleure mise en œuvre utilisait un hashmap et un chaînéelike this
J'ai essayé de faire une liste chaînée, puis réalisé que chaînée n'a pas été bonne idée pour Erlang, like this thread. La question est de savoir comment faire un cache LRU avec Erlang?
Je pense que Erlang est le niveau trop élevé pour faire le cache de bas niveau et actuellement, Erlang a des caractéristiques similaires dans le noyau (comme ETS http://erlang.org/doc/man/ets.html), avez-vous testé certaines de ces fonctionnalités avant d'utiliser des projets externes? –
@MathieuK. merci pour vos commentaires. Oui, j'ai essayé. le problème clé est LRU. J'ai essayé d'utiliser une table pour enregistrer l'access_time, mais pour chaque lecture/mise à jour, j'ai besoin de mettre à jour (supprimer puis insérer) la table. Je me demande si cela pourrait être fait dans une meilleure méthode? – user3644708
Je n'ai pas une seule réponse à votre question. Si vous voulez implémenter un cache LRU performant dans Erlang, je pense que l'une des meilleures approches consiste à utiliser du code externe interconnecté avec [ports] (http://erlang.org/doc/reference_manual/ports.html) ou [NIF] (http://erlang.org/doc/tutorial/nif.html). La programmation en C n'est pas mon domaine préféré, mais si vous voulez un exemple d'implémentation du code C pour Erlang, vous pouvez vérifier [code source du faisceau] (https://github.com/erlang/otp/tree/maint/erts/ émulateur/faisceau). –