Lecture d'un fichier, vitesse d'execution

Signaler
Messages postés
34
Date d'inscription
samedi 17 juillet 2010
Statut
Membre
Dernière intervention
14 mai 2012
-
Messages postés
305
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
18 janvier 2012
-
Bonjour,

voulant lire un gros fichier, il y a une question que je me pose pour ne pas faire ramer mon ordinateur et avoir la reponse la plus rapide possible.

Si j'ouvre un fichier .txt contenant jusqu'a plusieurs millions de lignes (plusieurs centaines de millions), chacune contenant (ou pas) un nombre qui m'interesse (je sais a l'avance que le nombre comprends 9 chiffres et c'est a peu pres tout) et que je veux recuperer (faire la liste des nombres rencontres, la fequence d'apparition d'un nombre et lier cela a d'autres infos), j'ai pense a deux options :

la premiere consiste a recuperer les nombres au fur, et les enregistrer dans une liste (ou autre structure) par exemple, si je ne les ai pas rencontres avant

la deuxieme consisterait a preparer ce meme type de liste, mais a l'avance, intialisee a 0 pour la frequence d'apparitions.

Le probleme c'est que ces deux solutions me paraissent aussi bete l'une que l'autre : la premiere m'obligeant a parcourir ma liste a chaque fois que je rencontre un nombre, a la recherche de ce meme nombre, la deuxieme parce que je me reserve de la place tout a fait inutilement, tout ca parce que je connais juste l'intervale des valeurs qui peuvent etre prises et que je pense que la memoire risque de ne pas apprecier.

Existe-t-il une solution plus inteligente, ou sinon quelle serait la plus inteligente de ces deux solutions precedentes ?

7 réponses

Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
122
Pourquoi n'utilises-tu pas une table de hash ?
Ça te premettrait de ne créer des entrées que pour ce dont tu as besoin, et pour vérifier l'existance d'une entrée, ça serait quasi instantané. (En plus, avec comme clé, ta valeur, tu n'auras pas de collision).

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
34
Date d'inscription
samedi 17 juillet 2010
Statut
Membre
Dernière intervention
14 mai 2012

Merci pour la reponse. Desole d'avoir mis du temps pour repondre, mais j'ai du m'instruire sur les tables de hachage. Je ne suis pas tout a fait sur que ce soit la solution ideale pour mon probleme.

Pour etre concret :
disons que j'ai un fichier sur x personnes (x >> 1) fequentant un nombre y de piscines publiques. J'ai des information sur leur sexe, le temps qu'elles restent, s'y elles viennent seules, avec des enfants, quels jours, s'y elles achetent des frites a la cafeteria et ainsi de suite.

Comment trier les informations pour que lorsque je lui demande "quels clients frequentent telle piscine ?" ou encore "donne moi la liste des clients qui viennent avec des enfants" ou bien encore "combien de personnes achetent des frites a midi" j'obtienne une reponse extremement rapide ?
Messages postés
305
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
18 janvier 2012

Ouai c'est une base de données quoi.
Tu as déjà ce fichier? Si oui utilise la lib en C++ qui l'exploite...
Sinon pareil tu choisis un format de base opensource (de préférence) et tu l'attaque par la lib en question
Messages postés
34
Date d'inscription
samedi 17 juillet 2010
Statut
Membre
Dernière intervention
14 mai 2012

oui c'est une base de donnee.

Je ne comprends pas bien le sens de "la lib en c++ qui l'exploite". Dois-je comprendre qu'il existe une biblitotheque c++ qui permet de creer une base de donnees et d'en tirer les informations ?
Si tel est le cas, existe-t-il la même chose pour le c. J'ai une aversion extremement prononcee pour tous les languages orientes objet depuis mes annees d'ecole.
Messages postés
305
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
18 janvier 2012

lol faut pas toucher au C++ alors
Il n'y a pas longtemps j'ai récupéré une base DBF d'un ancien soft pour le porter sur du récent. J'ai trouvé un "connector" (en gros une p'tite lib) avec les fonctions de base, load() write() addrecord() etc...
C'est quel format toi? tu le sais au moins?
Dans le cas contraire il va te falloir beaucoup de courage pour comprendre la structure du fichier. Surtout si une partie est écrite en binaire !
Messages postés
34
Date d'inscription
samedi 17 juillet 2010
Statut
Membre
Dernière intervention
14 mai 2012

A chaque fois j'ai deux fichiers txt, le premier contenant 14 "colonnes", le deuxieme 17 (j'ai enormement de paires de fichiers comme ça).

Je n'ai pas de probleme pour recuperer les informations (dans des strucutres) et traiter tout un tas d'operations basiques comme faire des sommes ou des recherches. Mais j'aimerais bien pouvoir faire tout un tas d'autres operations dans un temps "raisonnable". D'ou le "comment trier ces informations". La table de hachage proposee precedemment me semble un bon point de depart, mais a mon avis il m'en faudrait plusieurs avec des pointeurs les unes vers les autres a mon avis.

Si je pouvais avoir une librairie qui me permettent de trier ces informations comme dans une base de donnee ce serait pas mal.
Messages postés
305
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
18 janvier 2012

Oui oui sauf que ce format (bien tordu apriori) est certainement propriétaire et très peut utilisé... Oublie tu ne trouvera certainement pas de lib toute faite.
Sois fort