web-dev-qa-db-fra.com

Algorithme de remplacement de cache le plus efficace

Wikipedia list 11 algorithmes de remplacement de cache . En supposant que je ne sais presque rien à propos de l'application que je vais développer, Que dois-je utiliser comme algorithme de remplacement de cache "par défaut"

Si je me souviens bien de mon cours OS, LRU est le meilleur algorithme de remplacement de cache général. Mais peut-être que je me trompe.

En outre, cela est un peu une question académique, car, généralement, la mémoire principale est bon marché et abondante et que je n'ai pas vraiment besoin de vous inquiéter de la taille du cache trop.

12
ashes999

Je suppose que la meilleure réponse est que cela dépend. Dans mon expérience, il y a beaucoup de facteurs qui choisissent des algorithmes de mise en cache.

Facteurs à considérer

  1. Équilibre lecture/écriture. (Quel pourcentage d'accès sont lus vs écrit)
  2. Quantité de cache.
  3. Type de média derrière le cache. (Sont-ils lents SATA Drives ou des disques SSD rapides?)
  4. Hits vs manque. (À quelle fréquence les choses sont-elles réécrites ou relisées?)
  5. Taille d'accès moyenne (ceci va choisir la taille de la page)
  6. Combien coûtent-ils et écrit.

Une fois que vous envisagez tous les différents facteurs, vous devez alors trouver un algorithme de cache qui gère le meilleur. Par exemple, disons que vous avez une application où il y a beaucoup d'écritures, certaines réécrit, des lectures de données récemment écrites et une sorte de média en rotation. Dans ce cas, vous voudriez une sorte d'algorithme de mise en cache hybride. Pour gérer les données d'écriture, vous pouvez souhaiter quelque chose comme WISE ORDRE D'Écrivez (WOW) et un algorithme LRU pour des données qui ont été lues à partir du disque. La raison en est que les accès au disque sont très coûteux et l'algorithme WOW rendra plus efficace pour écrire des données et le LRU restera fréquemment accessible aux données toujours dans le cache.

Dites que vous avez des disques SSD, qui ont une heure d'accès très rapide, vous voudrez peut-être préciser votre choix vers l'algorithme LRU puisque les accès du disque sont relativement peu coûteux.

Donc vraiment ce que je veux dire, c'est qu'il n'y a pas de "meilleure" réponse. La meilleure réponse consiste à connaître les facteurs qui s'appliquent à vous et choisissez un algorithme qui les gère le mieux.

Comment trouver l'algorithme pour vous

Profil de votre système. Cela implique généralement d'ajouter du code pour conserver des statistiques pour les accès à la mémoire. En profilant, vous pouvez voir quels facteurs sont les plus importants pour vous.

Dans le passé, j'ai ajouté du code pour suivre tous les accès de la mémoire sur une période de temps. Ensuite, plus tard, je cherche des modèles. Je recherche des re-Reads, réécrit, accès séquentiel, accès aléatoire, etc.

Une fois que vous avez identifié des choses d'importance, vous devez examiner tous les différents types d'algorithmes de mise en cache pour voir quelle poignée qui est la meilleure.

15
barrem23

En supposant que vous ne connaissez presque rien sur l'application que vous allez développer, vous devez en savoir plus avant de choisir et de mettre en œuvre un système de cache. En d'autres termes, il n'y a pas d'implémentations par défaut: certains sont bons à des fins et sont totalement mauvais pour les autres.

Par exemple, prenez seulement deux implémentations: moins récemment utilisées et moins fréquemment utilisées. Comment décider lequel utiliser avant un autre?

  • LRU est bon lorsque vous êtes sûr que l'utilisateur accédera plus souvent aux articles les plus récents et ne reviendra jamais ni rarement sur les anciennes. Un exemple: une utilisation générale d'un client e-mail. Dans la plupart des cas, les utilisateurs accèdent constamment aux courriers les plus récents. Ils les lisent, les reporter, revenons en quelques minutes, heures ou quelques jours, etc. Ils peuvent se retrouver à la recherche d'un courrier qu'ils ont reçu il y a deux ans, mais cela se produit moins fréquemment que d'accéder aux mails qu'ils ont reçu les deux dernières heures.

  • D'autre part, LRU n'a aucun sens dans le contexte où l'utilisateur accédera à certains éléments beaucoup plus fréquemment que d'autres. Un exemple: j'écoute fréquemment la musique que j'aime, et cela peut arriver que sur 400 chansons, j'écouterais les mêmes cinq au moins une fois par semaine, alors que je vais écouter le plus une fois par an 100 chansons que je n'aime pas aussi beaucoup. Dans ce cas, LFU est beaucoup plus approprié.

En ne prenant que deux des implémentations, vous voyez qu'il n'y a pas d'algorithme "par défaut" que vous pouvez utiliser lorsque vous ne voulez pas penser à la meilleure ou ne pas avoir assez d'informations sur l'application. C'est bien, comme si vous demandez si par défaut, vous devez ajouter, soustraire, multiplier ou diviser deux numéros pour trouver un résultat d'un calcul lorsque vous ne connaissez rien à ce sujet.

9
Arseni Mourzenko

Pourquoi limiter vos choix uniquement à Wikipedia? Si vous avez accès à une base de données de recherche comme la Bibliothèque numérique ACM , vous trouverez encore plus d'algorithmes. Soyez également conscient de jouer avec des brevets. Par exemple, l'arc est un bon algorithme, mais malheureusement, il est breveté.

3
sakisk

Vous pouvez passer beaucoup de temps à l'agonisation de l'algorithme "meilleur", ou vous pouvez simplement implémenter un algorithme simple et continuer avec le REST du système. Lorsque vous avez quelque chose de testable Ensuite Vous inquiétez de l'algorithme.

Optimisation prématurée ...

2
Ross