Salut,
Quelqu'un m'a demandé comment optimiser une lecture de fichier formatée qui était trop lente, et je ne savais pas vraiment comment faire.
Je lui ai d'abord demandé s'il ne pouvait pas utiliser des bibliothèques déjà faites, mais il ne savait pas si son tuteur l'autorisait à le faire.
Les fichiers qu'il doit lire sont des images au format texte, .ppm, qui se présente sous la forme suivante :
- La première ligne, c'est un nom de code.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 P3 # commentaire... genre généré par Irfanview 128 128 255 0 255 255 0 128 120 ... ...
- La deuxième ligne, c'est un commentaire.
- La 3e ligne : largeur et hauteur
- La 4e ligne : la valeur max autorisée pour les entiers qui suivent
- Le reste des lignes (le nombre d'entiers sur une ligne n'est pas constant) : les composantes RVB de chaque pixel.
Il utilise std::ifstream pour lire, il alloue le vecteur de pixel à l'avance dès que la taille de l'image est connue, et il fait une double boucle pour lire les pixels du fichier.
Le problème, c'est pour charger une image genre qui fait environ 4.5 Mo (ça fait environ 640x480 pixels), ça met 3 secondes sur son ordinateur environ, alors qu'Irfanview le lit quasi instantanément.
C'est bien trop lent, il est censé analyser des images qui sortent d'une webcam à une fréquence assez soutenue genre 10 fois par sec.
- Comment s'y prendre ? std::streambuf, c'est pas pour des choses formatées.
- C'est pas mieux de charger le tout dans un std::string et d'utiliser un parseur ?
Partager