[C++] supprimer des lignes dans un fichier pour gagner du temps

supprimer des lignes dans un fichier pour gagner du temps [C++] - C++ - Programmation

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 ;)

Reply

Marsh Posté le 16-04-2004 à 17:16:19   

Reply

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


Message édité par Taz le 16-04-2004 à 17:20:20
Reply

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 ?

Reply

Marsh Posté le 16-04-2004 à 17:47:38    

je parlais pas de choses en mémoire, je te parlais de structure de fichier

Reply

Marsh Posté le 19-04-2004 à 09:45:58    

la dichotomie pourrait etre une bonne solution

Reply

Marsh Posté le 19-04-2004 à 13:39:48    

je crois pas

Reply

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.


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 22-04-2004 à 16:30:07    

taz, pq la dichotomie dans ce cas precis ne serait pas valable ?

Reply

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed