Manipulation de grands fichiers

Signaler
Messages postés
55
Date d'inscription
mardi 16 septembre 2003
Statut
Membre
Dernière intervention
4 août 2008
-
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011
-
Bonjour, c'est encore moi ;-)

Je me demande si lorsque l'on manipule un grand fichier (plusieurs Mo, voir même plusieurs Go) on peut mettre toutes les valeurs dans un buffer, à l'initialisation du programme, par exemple, et les garder en mémoire tout le temps qu'on utilise ce fichier au sein du programme.

Par exemple, avec un logiciel connu tel que Word, lorsque l'on ouvre un fichier énorme (par exemple avecplusieurs centaines de pages + des images, etc), je pense que le fichier est d'abord chargé en mémoire (donc tout le fichier), puis l'utilsateur ne modifie pas constamment ce fichier, mais plutôt un Buffer.
Est ce que c'est comme ça que l'on doit procéder? Ou plutôt faire un grand nombre d'accès au fichier (avec ReadFile et WriteFile) quand l'utilisateur change quelque chose dans la fenêtre d'édition?
Car pour des gros fichiers, la place en mémoire est assez conséquente (peut être même pas suffisante), je me trompe?

Moi je mettrais le tout dans un buffer au début, en lisant le fichier, que je fermerais tout de suite après, puis je rentrerais toutes les modifications nécessaires durant l'execution du programme, et ce n'est que quand l'utilisateur ferme le programme que je recopierai le buffer dans le fichier...

JB

3 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
2 Go de memoire maxi adressable par processus.
Il est donc hors de question de charger des fichiers enormes en 1 passe.

ciao...
BruNews, Admin CS, MVP VC++
Messages postés
55
Date d'inscription
mardi 16 septembre 2003
Statut
Membre
Dernière intervention
4 août 2008

OK, merci, je ne savais pas.
(je ne sais pas grand chose, mais j'apprends, lol)

JB
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

FileMapping, très utile pour manipuler de gros fichier ...

char tmp[] = "Bonjour, c'est moi NitRic!";
void * file = CreateFile(...);
void * map = CreateFileMapping(...);
char * ptr = MapViewOfFile(...);

/* dison que le fichier est plutot gros */
memcpy( ptr+564123, tmp, sizeof(tmp));

/* etc ... */
/* etc ... */
/* etc ... */
/* attention, pas de ++ptr ou ptr+=num; etc ...
utiliser un autre pointeur pour faire ca;
char * ptr2 = ptr;
while ( *ptr2++ ) { ... } par exemple
*/

UnmapViewOfFile(ptr);
CloseHandle(map);
CloseHandle(file);

il y à aussi FlushMapViewOfFile() pour faire un flush ou deux si besoin sur le disque, etc ... faut juste faire attention de pas dépasser la taille du fichier sinon une exception est générée ...

~(.:: NitRic ::.)~