Classements de données dynamiques avec PHP
Upcoming SlideShare
Loading in...5
×
 

Classements de données dynamiques avec PHP

on

  • 1,619 views

Présentation d'un système simple pour pouvoir maintenir des classement sur un grand volume d'entrées avec une contrainte : 100% PHP.

Présentation d'un système simple pour pouvoir maintenir des classement sur un grand volume d'entrées avec une contrainte : 100% PHP.

Statistics

Views

Total Views
1,619
Views on SlideShare
1,613
Embed Views
6

Actions

Likes
1
Downloads
0
Comments
0

2 Embeds 6

http://www.linkedin.com 4
http://www.lmodules.com 2

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Classements de données dynamiques avec PHP Classements de données dynamiques avec PHP Presentation Transcript

  • Topz Plein de joueurs. Chaque joueur a : •un identifiant •un score Un juge doit afficher en permanence les meilleurs scores. Comment faire ?
  • 1ère méthode : base de données SQL, table temporaire 1.On demande à tous les joueurs de se classer 2.On note les noms des premiers •Le juge ne se fatigue pas trop •Les développeurs non plus •Compatible avec des mises à jour très fréquentes •Les résultats ne sont pas disponibles en temps réel •Nécessite un ou plusieurs serveurs dédiés (“slaves”) •Conserver l’ordre d’arrivée nécessite davantage de calculs
  • 2nde méthode : Indexation - B+Tree / BST 0 View slide
  • 2nde méthode : Indexation - B+Tree / BST 7 0 View slide
  • 2nde méthode : Indexation - B+Tree / BST 7 3 0
  • 2nde méthode : Indexation - B+Tree / BST 7 3 2 0
  • 2nde méthode : Indexation - B+Tree / BST 7 3 2 2 0
  • Il est simple et rapide de connaître en temps réel les premiers, en tenant compte de l’ordre d’arrivée En ayant localisé un joueur, il est tout aussi simple et rapide de connaître les joueurs qui le suivent et qui le précèdent.
  • Mais comment trouver la place d’un nouvel arrivant ou d’un joueur dont le score a changé ? Le joueur peut se promener jusqu’à trouver sa place... 399 427 ? 57 211 0
  • Mais comment trouver la place d’un nouvel arrivant ou d’un joueur dont le score a changé ? Pour gagner du temps, il peut y avoir deux files... < 250 000 ≥ 250 000
  • Mais comment trouver la place d’un nouvel arrivant ou d’un joueur dont le score a changé ? ...et même des sous-files. < 250 000 ≥ 250 000 < 125 000 ≥ 125 000
  • Il est simple et rapide de connaître en temps réel les premiers, en tenant compte de l’ordre d’arrivée. En ayant localisé un joueur, il est tout aussi simple et rapide de connaître les joueurs qui le suivent et qui le précèdent. Mais les mises à jours nécessitent plus d’espace de stockage et de temps de calcul qu’avec la méthode précédente.
  • 3ème méthode : Topz Principe : les joueurs ne se classent pas. Ils se contentent d’informer le juge lorsque leur score change et c’est le juge qui se débrouille pour garder à jour la liste des meilleurs scores.
  • Nous souhaitons par exemple afficher en permanence les noms des trois joueurs ayant le meilleur score. Tant que la liste contient moins de trois noms, rien de plus simple : on inscrit tous les joueurs dont on apprend le nom. Bill : 150 Bob : 28 Bart : 23
  • Une seule chose est à retenir pour pouvoir sélectionner les meilleurs : la note du plus mauvais des meilleurs (23). 12 22 Poubelle Bill : 150 7 Bob : 28 Bart : 23 Berta : 25
  • Si un nouvel arrivant a sa place dans le classement, le plus nul des meilleurs se fait virer. Bill : 150 Bob : 28 Bart : 23 Poubelle
  • Et le nouvel arrivant doit trouver sa place. ? Bill : 150 Berta : 25 Bob : 28 Il faut aussi replacer les anciens joueurs chaque fois que leur score change.
  • Placer un joueur au bon endroit dans le classement est une opération rapide avec les bonnes structures de données. Mais PHP ne sait pas structurer les données sous forme d’arbres. Les listes chaînées n’existent pas non plus. On doit se contenter des tableaux associatifs (hashes) mais ils sont lents et gourmands en mémoire. On oublie donc le classement en temps réel en PHP. Il se fera à intervalles réguliers à l’aide des classiques fonctions de tri.
  • Un nouvel arrivant sera donc simplement placé en fin de liste, tandis qu’un ancien joueur classé donc le score vient de changer gardera sa position. Bill : 28 Bill : 28 Bob : 150 Bob : 39 Bob : 39 Bart : 44 Bart : 44 Berta : 35 Berta : 35
  • Si le score du plus mauvais diminue, il n’y a rien de particulier à faire, si ce n’est de mémoriser le nouveau plus mauvais score. Bill : 28 Bill : 21 Bill : 21 Bob : 39 (toujours le plus mauvais) Bob : 39 Bart : 44 Bart : 44 Berta : 35 Berta : 83
  • Si le score du plus mauvais augmente, il est nécessaire de trouver le nouveau plus mauvais. Le plus mauvais score devient 35. Bill : 21 Bill : 83 Bill : 83 Bob : 39 Bob : 39 (ancien plus mauvais) Bart : 44 Bart : 44 Berta : 35 Berta : 35 En PHP, toute la liste doit être parcourue pour le trouver.
  • TopX : une classe PHP qui reçoit un flux de scores associés à des joueurs. Elle utilise le système décrit précédemment pour tenir à jour la liste des X joueurs avec les meilleurs scores et/ou des X joueurs avec les scores les plus faibles. C’est un classement absolu, sans notion de temps.
  • TopT : une classe PHP qui établit un classement sur une période de temps, d’après un classement absolu (TopX) de référence. TopX TopX TopX Accumulateur A : 12 A :7 A :6 A : 25 B :5 B :4 B :6 B : 15 C :8 C :3 C :2 C : 13 D :7 D :7 E :1 E :3 E :4 L’accumulateur est aussi un objet de la classe TopX.
  • Les scores de l’accumulateur peuvent être normalisés. TopX TopX TopX Accumulateur A : 12 A :7 A :6 A : 8,3 B :5 B :4 B :6 B : 5,0 C :8 C :3 C :2 C : 4,3 D :7 D : 2,3 E :1 E :3 E : 1,3
  • Les scores communiqués à l’accumulateur peuvent aussi être calculés en tenant compte d’un amortissement : les scores des TopX perdent du poids avec l’âge (si seulement c’était le cas dans la vraie vie...) Les résultats les plus récents ont donc des conséquences plus visibles, les classements deviennent artificiellement plus dynamiques.
  • T0 T1 T2 T3 T4 TopX TopX TopX TopX TopX TopX TopX TopX TopX TopX TopX A chaque itération T : Accumulateur = Accumulateur - TopX(T-n) + TopX(T)
  • La liste des mises à jour (“ping”) Mises à jour T0 T1 T2 T3 T4 A : T0 B : T4 TopX TopX TopX C : T3 TopX TopX TopX TopX D : T2 TopX TopX TopX TopX E : T1 La liste des mises à jour contient, pour chaque élément présent dans l’accumulateur, la date de sa dernière mise à jour. Un élément est retiré de l’accumulateur et de la liste des mises à jour lorsque sa date de mise à jour est inférieure ou égale à T-n.
  • La classe TopXT prend en charge différents classements d’un même jeu avec les même joueurs. TopXT TopX TopT TopX TopT TopX TopT TopX TopT TopX
  • La classe TopXT prend en charge différents classements d’un même jeu avec les même joueurs. TopXT “default” TopX TopT TopX TopT TopX TopT TopX TopT TopX
  • La classe TopXT prend en charge différents classements d’un même jeu avec les même joueurs. TopXT TopX TopX “default” TopX TopT TopX TopT TopX TopT TopX TopT TopX
  • La classe TopServer TopServer TopXT TopXT TopXT TopX TopX “default” TopX TopT TopX TopT TopX TopT TopX TopT TopX
  • La classe TopServer Descriptions TopServer Classements et scores réseau TopXT TopXT TopXT Un objet de la classe TopServer reçoit la description des classements à effectuer (“TopXT”), ainsi que les scores actualisés des joueurs.
  • Code PHP pour exporter les classements. UDP TopServer Code PHP pour sauvegarder l’objet pour un redémarrage à chaud.
  • Les clients UDP Application Tampon d’envoi File d’envoi à Pile TCP/IP l’interface réseau Interface réseau Si le tampon est plein, l’application en est informée. (erreur ENOBUFS)
  • Les serveurs UDP File de réception de Interface réseau l’interface réseau Tampon de réception Pile TCP/IP Application
  • Les serveurs UDP Si le tampon est trop petit, les paquets qui ne pourront s’y loger seront ignorés et l’application n’en sera pas informée. Si le tampon est trop gros, le retard risque d’être important.
  • Les serveurs UDP Pour éviter la perte de paquets : •netstat -su •setsockopt(... SO_SNDBUF ...) •sysctl net.core.rmem_max •utilisation de threads et de tampons dynamiques.