Fichier de 3Mo parcouru en 15sec, comment faire plus rapide ?

Signaler
Messages postés
261
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
27 septembre 2008
-
Messages postés
261
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
27 septembre 2008
-
Bonjour,
Je voudrais savoir comment faire pour parcourir mon fichier plus rapidement, je travaille sur un algo de compression et donc il faudrai que mon fichier soit parcouru assez vite, winrar va plus vite sauf que lui il ecrit en plus !!

Voila mon code je pense que c'est la qu il y a des choses a ameliorer

fseek(fichier,0,SEEK_END);
int lmsg=ftell(fichier);

for (i=0;i<lmsg-1;i++)
{
fseek(fichier,i,SEEK_SET);
c=fgetc(fichier);
octet[c]+=1;
}

13 réponses

Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
7
je sais pas pourquoi tu fai du fseek !!!
moi je ferai plutot :

fseek(fichier, 0, SEEK_SET);
while (!feof(fichier)) {
c = fgetc(fichier);
octet[c]++;
}

J'ai pas testé mais ca devrait marcher je pense
Messages postés
261
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
27 septembre 2008

Parce que qu en je fai sa le dernier octet renvoyé est en dehors du fichier et il met une valeur dans mon tableau alors qu il ne devrai pas voila pouquoi j ai utilisé fseek mais vu qu il est en dehors de ma boucle je crois pas que c sa qui pourrait ralentir ma lecture
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
7
heu c en dehors de la boucle ca :?!!!

for (i=0;i<lmsg-1;i++)
{
fseek(fichier,i,SEEK_SET);
c=fgetc(fichier);
octet[c]+=1;
}

normalement, quand tu fai un fgetc(), l'indicateur de position du fichier avance automatiquement !!!

enfin pour rester dans ton "delire", tu peu faire ca, ca sera surement plus rapide :

fseek(fichier,0,SEEK_END);
int lmsg=ftell(fichier) - 1;
fseek(fichier,0,SEEK_SET);

for (i=0;i<lmsg;i++)
{
c=fgetc(fichier);
octet[c]++;
}
Messages postés
261
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
27 septembre 2008

ah je croyai que tu parlai de celui que j avai mi au debut je savai pas que sa avancait tout seul je vais tester tout de suite
Merci !
Messages postés
261
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
27 septembre 2008

Mouai
Winrar est beaucoup plus rapide quand meme
Ce serais peut etre plus rapide de recuperer une chaine et de traiter la chaine, le nombre d acces au fichier serait reduit
Mais si sa change rien alors la ... je sais plus quoi faire
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
7
ouais mais j'espere que tu essayes pas d'arriver au niveau de winrar?! parce que les mecs ca fait un pti bout de temps qu'ils sont dessus, et je pense qu'ils utilisent des algo mathematiques pour compresser.
Enfin sinon je sais pas trop commetn faire.bonne idee de minimiser le nombre d'acces fichier, reste a savoir si le gain est significatif ...
Messages postés
261
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
27 septembre 2008

Avec un text qui utilise que 18 caracteres j ai reussi a compresser 8 bits de mieux !!!
L algo de huffman donnait 166bits une fois compressé et j ai compressé le texte a 158 bits !!!!!!!!
Mais je dois l etendre a 256 carcteres
De toute facon meme si j arrive pas au niveau de winrar je posterai quand meme ma source quelqu un trouvera peut etre un moyen de l ameliorer.
Deja je crée pas d'arbre...
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Aucun algo correct ne lit un fichier octet par octet, il faut remplir un buffer et travailler en mémoire puis boucler tant que tu as des octets d'aspirés dans le buffer. Bosse sur un buffer de 512 Ko minimum, tous les disques ont au moins 4 Mo de cache à notre époque.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
261
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
27 septembre 2008

OK j avai tester avec 1000 octet et pour 3Mo c etait deja plus rapide donc je vais j utiliserai 512Ko pour la suite.
La j en suis a inscrire les bits dans les octets mais je sais pas trop quoi utilisé je vais tenter les operateurs bit a bit je pense que c est mieux qu utiliser des chaines de caracteres
Messages postés
361
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
19 mars 2015

comme le dit BruNews, il te faut 2 buffers, 1 en lecture, 1 en ecriture

il te suffit ensuite de les gerer



pour la compression, tu seras obligé de traiter "octet par octer" mais en memoire !
Messages postés
261
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
27 septembre 2008

Ah il en faut un en ecriture aussi ?
Donc si j ai bien compris je recupere les donnees dans le buffer 1, j applique la compression et enregistre les donnees compressées dans le buffer 2 et ensuite je l ecrit qur le disque.
C est dur d ecrire les donnees bit a bit arghh
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Mais on n'écrit pas non plus OCTET par OCTET, on tamponne le buffer sur sa longueur remplie en 1 passe.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
261
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
27 septembre 2008

Oui jm en suis douté je croyais que le cache du disque ne servait que pour la copie des fichiers mais je viens de comprendre son utilité.Avec un buffer de 512Ko c est instantané ! J espere juste que ma fonction de compression va pas ralentir tout sa
En tout cas merci de votre aide !
Je me suis toujours demander pourquoi mon prog de cryptage etait aussi lent maintenant je sais pourquoi :)