Optimiser un prg d'annuaire téléphonique

Résolu/Fermé
khaoula.85 Messages postés 31 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 3 décembre 2009 - 7 janv. 2009 à 22:55
khaoula.85 Messages postés 31 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 3 décembre 2009 - 8 janv. 2009 à 11:15
Hello,
On me demande d'optimiser un petit programme d'annuaire d'entreprise. Les utilisateurs entrent un nom et obtiennent le numéro de téléphone associé en retour. Ce programme lit dans un fichier texte des milliers de couples d'information "nom / numéro de téléphone". Le fichier texte fait quelques dizaines de Mo.
Ce dernier est mis à jour une fois par jour, la nuit, quand l'application est éteinte.


Actuellement, pour chaque demande utilisateur, le programme parcourt séquentiellement le fichier pour trouver la réponse à renvoyer. Cette opération prend parfois plusieurs secondes. Je dois penser à une optimisation pour accélérer les demandes utilisateur sans remplacer pour autant le fichier texte par une base de données.

Après avoir lu la description du problème, la première solution qui me vient à l'esprit à chaud est la suivante :

Au début, je devrais ramener tout le fichier texte dans la mémoire en sauvegardant la date de modification. Le fichier sera bien sûr mappé dans une liste d'objets. Maintenant pour entamer la recherche, je vérifie si le fichier a été modifié, si oui je le recharge ; sinon je cherche directement dans mes objets chargés en mémoire. Je gagne de la performance puisque l'accès à la mémoire est nettement plus rapide que l'accès E/S disque dur.

Est-ce la bonne solution ?
Merci.

1 réponse

Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 328
7 janv. 2009 à 23:22
Bonsoir,
Est-ce la bonne solution ? C'est une solution, je pense qu'il y en a d'autres.
Je trouve qu'elle est pas mal, mais pas encore parfaite, on va essayer de l'améliorer encore.

Tout d'abord, sans utiliser de base de données, c'est pas terrible, mais s'il faut faire avec, c'est évident qu'il faut utiliser au maximum la mémoire, et éviter les accès disque. Ensuite, à toi de voir si charger l'intégralité des informations dans la mémoire n'est pas excessif (si ce n'est pas le cas, alors tant mieux!).

Maintenant pour entamer la recherche, je vérifie si le fichier a été modifié, si oui je le recharge ; sinon je cherche directement dans mes objets chargés en mémoire.
Ca par contre, il faut se méfier (voire même oublier). C'est simple : si ton application est fermée, tu as de très grands risques que les données en mémoire aient disparu (si ton pc s'éteint, la ram se vide; si d'autres programme ont besoin de mémoire, tes données seront effacées automatiquement car plus personne n'en a besoin).
Le mieux, c'est de charger intégralement les données en mémoire à chaque démarrage de l'application, ou lorsque le fichier est modifié (si l'application n'est pas fermée, elle devra mettre à jour ses données).

Enfin, il est nettement préférable d'utiliser une table de hachage plutôt qu'une liste pour stocker tes données : tu les retrouveras en temps quasi-constant, contre un temps linéaire avec ta liste.
A toi de trouver une bonne fonction de hachage maintenant :)

Cordialement,
0
khaoula.85 Messages postés 31 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 3 décembre 2009
7 janv. 2009 à 23:42
Merci beaucoup !

Je vais devoir réfléchir à une fonction de hachage :)

En lisant ta réponse -je ne sais pas pourquoi- j'ai eu l'idée d'implémenter deux curseurs, le premier se pointe au début du fichier et le deuxième à sa fin. Ils parcourent le fichier en même temps et le premier qui retrouve le nom recherché envoie un signal d'interruption au deuxième. J'ai travaillé sur un projet pareil en C++, je ne sais pas si c'est faisable dans ce cas 8)

Excellente soirée !
0
Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 328 > khaoula.85 Messages postés 31 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 3 décembre 2009
8 janv. 2009 à 11:04
Si tu utilises une table de hachage, tu n'as plus besoin de parcourir ta liste de nom.
En gros, il faudra que tu parcoures une fois ton fichier linéairement pour tout stocker dans ta table de hachage (donc on ne parle pas ici de recherche de nom). Une fois que ce sera fait, quand une personne recherchera un nom, tu n'auras pas de parcours à faire, tu le récupèreras directement grâce à ta structure.
Pas besoin d'implémentation de plusieurs curseurs donc (d'autant plus qu'en terme de performances, c'est pas terrible de faire ça, car ça demande beaucoup plus d'IO au niveau du disque dur, et c'est beaucoup plus long).

Cordialement,
0
khaoula.85 Messages postés 31 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 3 décembre 2009 > Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009
8 janv. 2009 à 11:15
Merci encore une fois. Je mets mon post en résolu.

:)
0