supprimer des lignes dans un fichier pour gagner du temps [C++] - C++ - Programmation
Marsh Posté le 16-04-2004 à 17:19:53
1) utilise un SGBD
2) y a plein de techniques pour stocker et utiliser efficacement des enreigstrements dans un fichier : chainage, table de hachage, bitmap, index, etc
Marsh Posté le 16-04-2004 à 17:46:17
Pour l'instant, je souhaite explorer la solution "code". J'ai pas de SGBD sous la main...
Je ne suis pas sûr, mais je crois qu'utiliser des structures (listes chainées, tables...) prend beaucoup de ressources memoire, d'autant que j'ai une quantité de données très importante à traiter. De plus, il faut aussi le temps de créer ces structures à partir du fichier, ce qui n'est pas ideal, meme s'il ne faudrait parcourir le fichier qu'une seule fois.
Sinon, qu'est-ce que le bitmap ?
Marsh Posté le 16-04-2004 à 17:47:38
je parlais pas de choses en mémoire, je te parlais de structure de fichier
Marsh Posté le 20-04-2004 à 23:04:53
tu peux définir une taille fixe pour chaque enregistrement. puis s'ils sont contigus, et sans trou, tu sais directement ou tu as a aller suivant ton n° d'enregistrement. s'ils ne le sont pas, tu peux créer un index : une suite d'associations {n°enregistrement, offset enregistrement} de taille fixe dans un autre fichier.
Marsh Posté le 22-04-2004 à 16:30:07
taz, pq la dichotomie dans ce cas precis ne serait pas valable ?
Marsh Posté le 22-04-2004 à 17:22:16
Juntao2k2 a écrit : taz, pq la dichotomie dans ce cas precis ne serait pas valable ? |
ben t'es sur un fichier, c'est pas facile de maintenir l'ordre dans un fichier
Marsh Posté le 16-04-2004 à 17:16:19
Bonjour,
J'ai un fichier (fstream) qui contient un grand nombre d'enregistrements du genre champ1 champ2... champN.
Mon fichier ressemble à :
100 data1
100 data2
101 data3
101 data4
101 data5
...
1389 dataY
1389 dataZ
Je voudrais faire un traitement sur les données indexés 1000 par exemple.
Je fais donc une recherche sequentielle, avec des getline(), et je teste si je suis sur 1000. Ce qui fait perdre un temps fou, surtout quand je dois faire le traitement pour chaque index : ca peut prendre 2s pour le premier mais aussi 10s pour le dernier parce que je dois parcourir tout le fichier avant.
Y aurait-il une méthode plus efficace pour accéder à un enregistrement ? Quelque chose qui pourrait ressembler idealement à une requête sur SGBD ?
J'avais pensé à supprimer l'enregistrement en cours une fois que son traitement est terminé, mais comment faire ? Est-il possible de supprimer (ou effacer) la ligne courante d'un fichier ?
J'ai vu sur certains forums qu'une solution serait de copier le reste du fichier (sans la ligne lue dernierement) dans un autre fichier et de travailler ensuite sur ce nouveau fichier. Le problème c'est toujours le temps de traitement: il faut parcourir tout le reste du 1e fichier pour le copier dans le 2e. Ca revient donc au meme en terme de performance...
Autre solution : garder en memoire l'emplacement courant dans le fichier puis revenir à cet emplacement à la nouvelle ouverture du fichier, mais comment ca marche ?
Merci pour votre aide