Topz


Plein de joueurs.

Chaque joueur a :
•un identifiant
•un score
Un juge doit afficher en permanence les meilleurs
scor...
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 de...
2nde méthode : Indexation - B+Tree / BST




                   0
2nde méthode : Indexation - B+Tree / BST



                   7




                   0
2nde méthode : Indexation - B+Tree / BST



                   7


                   3




                   0
2nde méthode : Indexation - B+Tree / BST



                   7


                   3


                   2


         ...
2nde méthode : Indexation - B+Tree / BST



                   7


                   3


                   2    2


    ...
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é ...
Mais comment trouver la place d’un nouvel arrivant ou
        d’un joueur dont le score a changé ?

Le joueur peut se prom...
Mais comment trouver la place d’un nouvel arrivant ou
        d’un joueur dont le score a changé ?

   Pour gagner du temp...
Mais comment trouver la place d’un nouvel arrivant ou
        d’un joueur dont le score a changé ?

              ...et mê...
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é...
3ème méthode : Topz




Principe : les joueurs ne se classent pas.

Ils se contentent d’informer le juge lorsque leur scor...
Nous souhaitons par exemple afficher en permanence les
noms des trois joueurs ayant le meilleur score.

Tant que la liste c...
Une seule chose est à retenir pour pouvoir sélectionner
les meilleurs : la note du plus mauvais des meilleurs (23).

     ...
Si un nouvel arrivant a sa place dans le classement, le plus
nul des meilleurs se fait virer.



    Bill : 150
    Bob : ...
Et le nouvel arrivant doit trouver sa place.



                      ?
    Bill : 150
                          Berta : 2...
Placer un joueur au bon endroit dans le classement est
une opération rapide avec les bonnes structures de
données.

Mais P...
Un nouvel arrivant sera donc simplement placé en fin de
liste, tandis qu’un ancien joueur classé donc le score vient
de cha...
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 mauvai...
Si le score du plus mauvais augmente, il est nécessaire de
trouver le nouveau plus mauvais.

Le plus mauvais score devient...
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 pou...
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...
Les scores de l’accumulateur peuvent être normalisés.


 TopX         TopX       TopX           Accumulateur
 A : 12      ...
Les scores communiqués à l’accumulateur peuvent aussi
être calculés en tenant compte d’un amortissement : les
scores des T...
T0     T1    T2     T3     T4
 TopX TopX TopX
 TopX TopX TopX TopX
       TopX TopX TopX TopX


              A chaque ité...
La liste des mises à jour (“ping”)

                                              Mises à jour
     T0     T1     T2      ...
La classe TopXT prend en charge différents
classements d’un même jeu avec les même joueurs.


                    TopXT


...
La classe TopXT prend en charge différents
classements d’un même jeu avec les même joueurs.


                    TopXT


...
La classe TopXT prend en charge différents
 classements d’un même jeu avec les même joueurs.


                  TopXT
   ...
La classe TopServer

                  TopServer

   TopXT                               TopXT
                    TopXT
 ...
La classe TopServer

Descriptions
                       TopServer              Classements
 et scores réseau

        Top...
Code PHP pour
                      exporter les
                      classements.

UDP   TopServer
                    C...
Les clients UDP


    Application                      Tampon d’envoi


    File d’envoi à
                               ...
Les serveurs UDP



                                 File de réception de
  Interface réseau
                             ...
Les serveurs UDP




Si le tampon est trop petit, les paquets qui ne pourront
s’y loger seront ignorés et l’application n’...
Les serveurs UDP




Pour éviter la perte de paquets :

•netstat -su
•setsockopt(... SO_SNDBUF ...)
•sysctl net.core.rmem_...
Prochain SlideShare
Chargement dans…5
×

Classements de données dynamiques avec PHP

1 664 vues

Publié le

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

Publié dans : Technologie
0 commentaire
1 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
1 664
Sur SlideShare
0
Issues des intégrations
0
Intégrations
10
Actions
Partages
0
Téléchargements
2
Commentaires
0
J’aime
1
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive
  • Classements de données dynamiques avec PHP

    1. 1. Topz Plein de joueurs. Chaque joueur a : •un identifiant •un score Un juge doit afficher en permanence les meilleurs scores. Comment faire ?
    2. 2. 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
    3. 3. 2nde méthode : Indexation - B+Tree / BST 0
    4. 4. 2nde méthode : Indexation - B+Tree / BST 7 0
    5. 5. 2nde méthode : Indexation - B+Tree / BST 7 3 0
    6. 6. 2nde méthode : Indexation - B+Tree / BST 7 3 2 0
    7. 7. 2nde méthode : Indexation - B+Tree / BST 7 3 2 2 0
    8. 8. 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.
    9. 9. 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
    10. 10. 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
    11. 11. 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
    12. 12. 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.
    13. 13. 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.
    14. 14. 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
    15. 15. 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
    16. 16. 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
    17. 17. 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.
    18. 18. 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.
    19. 19. 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
    20. 20. 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
    21. 21. 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.
    22. 22. 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.
    23. 23. 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.
    24. 24. 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
    25. 25. 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.
    26. 26. 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)
    27. 27. 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.
    28. 28. 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
    29. 29. 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
    30. 30. 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
    31. 31. La classe TopServer TopServer TopXT TopXT TopXT TopX TopX “default” TopX TopT TopX TopT TopX TopT TopX TopT TopX
    32. 32. 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.
    33. 33. Code PHP pour exporter les classements. UDP TopServer Code PHP pour sauvegarder l’objet pour un redémarrage à chaud.
    34. 34. 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)
    35. 35. Les serveurs UDP File de réception de Interface réseau l’interface réseau Tampon de réception Pile TCP/IP Application
    36. 36. 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.
    37. 37. 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.

    ×