Bonjour,
Dans mon application, je lis des fichiers binaires volumineux (de 100 à 400 mo). Ceux-ci contiennent des objets sérialisés relativement petits mais en très grands nombres (quelques millions d'objets de 16 ou 20 octets). La structure du fichier est la suivante:
Actuellement, pour lire le fichier, j'utilise un ifstream.nb1[unsigned int] nb2[unsigned int] nb3[unsigned int]
obj1[20 octets]
...
obji[20 octets]
...
objnb2[20 octets]
avec
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 lireFichier(ifstream &in) { lireBinaireCplx(in, nb1); lireBinaireCplx(in, nb2); lireBinaireCplx(in, nb3); objSerialise obj; vector<objSerialise > vect; for (unsigned int i=0; i<nb2; i++){ lireBinaireCplx(in, obj); vect.push_back(obj); } }
Cependant, la lecture est très lente: un fichier de 100 mo est lu en 20 secondes. Lorsque je relance mon application, la lecture ne prend plus que 1,2 secondes, sans doute parce que le fichier est conservé en mémoire par windows.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 template < typename type_val > inline void lireBinaireCplx(ifstream& in, type_val& v) { in.read((char*)&v, sizeof(v)); }
D'où ma question: Comment accélérer la lecture de mon fichier? Je pense le charger entièrement en mémoire dans un buffer au début de la fonction lireFichier. Cependant, ce fichier étant très volumineux, puis-je le charger en plusieurs morceaux (paquets de 50 mo par exemple)? J'ai lu la FAQ développer sur la lecture/écriture de fichier et je n'ai pas trouvé de solution concernant un buffer pour les fichiers binaires. Avez-vous des suggestions de solutions.
Merci par avance,
Cordialement,
Benoît
Partager