Gestion de Fichiers Tri Interne Efficace et Tri Externe
2 Plan du cours daujourdhui Vue générale Tri interne efficace: heapsort Tri de grands fichiers mergesort Temp dexécution de mergesort Le cout associé à lallongement des fichiers Amélioration de la performance de mergesort Ajout de hardware Améliorations algorithmiques Chevauchement des opérations dentrée/sortie
3 Vue générale Ce cours sintéresse à la question du tri efficace dans le traitement des fichiers. En particulier, il sintéresse au tri efficace dans deux cas: Le cas où le fichier peut tenir en mémoire Le cas où le fichier est trop grand pour tenir en mémoire => Tri externe Les techniques de fusion discutées précédemment (i.e. traitement coséquentiel) sont très utiles pour le tri de grands fichiers.
4 Une approche efficace pour le triage en mémoire interne Nous navons considéré jusquà maintenant que le triage de fichiers assez petits pour tenir en mémoire: On peut lire le fichier du disque en mémoire On peut le trier en utilisant une procédure habituelle. On peut écrire le fichier trié sur le disque Si le fichier est lu et écrit de facon aussi efficace que possible et si le meilleur algorithme de triage est utilisé, il semblerait que lon ne peut pas améliorer cette procédure. Néanmoins, une amélioration est possible par un traitement en parallèle: on peut, en effet, lire et écrire en même temps que lon fait le triage.
5 Chevauchement du traitement et de lentrée/sortie: heapsort heapsort peut être combinée avec la lecture du disque et lécriture sur le disque, de la manière suivante: Le heap peut être construit pendant que le fichier non trié est lu du disque. Le tri peut être fait pendant que la partie triée du fichier est écrite sur le disque.
6 Construction du heap pendant la lecture du fichier Au lieu de faire un seek à chaque fois que lon veut un nouvel enregistrement, on peut lire des blocs denregistrements en une seule fois dans une mémoire tampon et opérer sur ce bloc avant de se tourner vers un autre bloc. La mémoire tampon dentrée pour chaque nouveau bloc devient une partie de la mémoire reservée pour le heap. A chaque fois que lon lit un nouveau bloc, on lattache à la fin du heap courant. Le premier nouvel enregistrement à ajouter est à la fin du tableau contenant le heap comme requis par la fonction dinsertion dans le heap. Une fois quun enregistrement est inserré, le nouvel enregistrement suivant est a la fin du tableau contenant le heap, de nouveau, prêt à être inserré.
7 Construction du heap pendant la lecture du fichier (suite) Afin de construire le heap en même temps, on a besoin de mémoires tampon multiples: tout en traitant les enreg.s dun bloc, on peut simultanément lire un autre bloc qui sera traité plus tard. Question: Combien de mémoires tampon doivent être utilisées et où doit-on les mettre? Réponse: Le nombre de mémoires tampon correspond au nombre de blocs dans le fichier et elles doivent être localisées en séquence dans le tableau. Puisque la construction du heap est plus rapide que la lecture de blocs, il peut y avoir certains delais.
8 Faire le heapsort tout en écrivant le fichier trié sur le disque (Fig. 8.19) Le plus petit enregistrement du heap est connu dès la première étape du heapsort. Donc, il peut être mis dans une mémoire tampon de sortie jusquà ce quun bloc entier trié soit determiné. Pendant que ce bloc est écrit sur le disque, un nouveau bloc trié peut être préparé, etc… Puisqua chaque fois quun nouveau bloc est écrit sur le disque, la taille du heap diminue par un facteur de un bloc, ce bloc peut être utilisé comme mémoire tampon. Ainsi on a autant de mémoire tampon de sortie quil y a de bloc dans le fichier. Puisque tout le I/O est séquentiel, cet algorithme marche aussi bien avec des disques que avec des bandes magnétiques. De même, três peu de seeking est nécessaire et la procédure est donc efficace.
9 Une technique efficace pour trier de large fichiers sur disques: mergesort Une solution pour le problème des fichiers qui ne tiennent pas en mémoire a déjà été présentée sous la forme de lalgorithme pour triage de clés. Cependant, cet algorithmes a deux insuffisances: Une fois que les clés étaient triées, il était couteux de chercher (seek) chaque enregistrement en ordre et de les écrire dans le nouveau fichier trié. Si le fichier contient de nombreux enregistrements, lindexe lui-même ne tiendra pas en mémoire. Solution: (1) diviser le fichier en plusieurs sous-fichiers triés (runs) en utilisant une méthode de tri interne; et (2) fusionner tous les runs avec mergesort (Fig. 8.21).
10 Avantages du mergesort Il peut être appliqué à des fichiers de toutes tailles. La lecture de fichier dentrée pendant létape de création des runs est séquentielle Peu de seeking. La lecture de chaque run pendant la fusion est aussi séquentielle. Le seul seeking necessaire est pour aller dun run à lautre. Si heapsort est utilisé pour létape de tri des runs en mémoire, son opération peut être chevauchée avec celle du I/O. Puisque le I/O est surtout séquentiel, des bandes magnétiques peuvent être utilisées.
11 Temps est nécessaire pour un mergesort Supposition de simplification: Seulement un seek est requis pour chaque accès séquentiel. Seulement un délai de rotation est nécessaire par accès. Etapes couteuses (incluant du I/O) de mergesort: Pendant la phase de Tri: Lecture de tous les enregistrements dans la mémoire pour le tri et la formation des runs. Ecriture des runs triées sur le disque. Pendant la phase de Fusion: Lecture des runs triées dans la mémoire pour la fusion Ecriture du fichier trié sur le disque.
12 Type de I/O prenant place lors des phases de tri et de fusion Puisque, pendant la phase de tri, les runs sont crées en utilisant heapsort, I/O est séquentiel. Aucune amélioration de performance nest possible ici. Pendant letape de lecture de la phase de fusion, il y a beaucoup daccès au hazard (puisque les runs différents sont amenées en mémoire et effacées de la mémoire de manière imprédictible). Le nombre et la taille de la mémoire tampon contenant les runs détermine le nombre daccès au hazard. De lamélioration de performance peut prendre place en cette étape. Letape decriture de la phase de fusion nest pas influencée par la facon dont on organize les runs.
13 Cout associé à lallongement des fichiers En général, pour une fusion de K runs où chaque run est aussi large que lespace libre en mémoire, la taille de la mémoire tampon pour chacun des runs est de: (1/K)*taille de lespace mémoire=(1/K)*taille de chaque run. Donc K seeks sont requis afin de lire tous les enregistrements dans chacun des runs individuels et puisquil y a k runs en tout, lopération de fusion requiert K 2 seeks. Puisque K est directement proportionnel à N, le nombre denregistrements, mergesort est une opération dordre O(N 2 ) comptée en nombre de seeks.
14 Que faire pour améliorer la performance de mergesort? La performance de mergesort peut être ameliorée de plusieurs façons: On peut allouer plus de hardware tel que des unités de disque, de la mémoire ou des chaines I/O. On peut performer la fusion en plus dune étape, en réduisant lordre de chaque fusion et augmentant la taille de la mémoire tampon pour chaque run. On peut augmenter la longueur des runs triés initial, algorithmiquement. On peut trouver des façons de chevaucher les opérations I/O.