Accélérer la lecture / écriture dans un fichier

infodaoudi Messages postés 117 Date d'inscription vendredi 10 février 2006 Statut Membre Dernière intervention 30 mars 2012 - 21 févr. 2009 à 18:01
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 26 févr. 2009 à 13:38
Bonjour ,
j'ai un programme qui utilise des entrée/sortie lecture écriture dans un fichier de taille très grande 20 go,
y-il un moyen pour accélérer le processus de lecture*/écriture dans ce fichier, voici ma fonction de lecteur est est définie inline et pourtant le temps d'exection est tres long,

inline    void GetidRegion(vecteur *a,int nb,Region *reg)
{
    int n;
   
    int cp=0;
    ifstream Al;
    Al.open(fichregion,ios::in|ios::binary);
    if(!Al){cout<<"error opening fichier";exit(0);}
    else
        while ((Al.read((char*)reg,sizeof(Region))))
        {
          
         
           cp++;
       
            
        }
     Al.close();
}

merci pour toute suggestion

4 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
21 févr. 2009 à 19:54
Salut,

Il faudrait essayer de ne pas ouvrir le fichier à chaque fois ! Une ouverture de fichier, c'est très long sous Windows et relativement long sous Linux (Les droits sont plus complexes sous Windows).

Ensuite, il faut voir la taille de tes "régions"... Si tu lis octet par octet tu as pas fini.

Faut essayer de lire des bloques de 4ko ou plus, de les garder en mémoire, et de lire dedans les parties qui t'intéressent.

A quoi te servent ton vecteur a et ton cp ??
0
gamemonde Messages postés 336 Date d'inscription samedi 9 août 2003 Statut Membre Dernière intervention 9 juillet 2011 2
21 févr. 2009 à 21:53
utiliser les fonctions windows ou  fopen au lieu d'utiliser ifstream sera aussi plus rapide
0
infodaoudi Messages postés 117 Date d'inscription vendredi 10 février 2006 Statut Membre Dernière intervention 30 mars 2012
26 févr. 2009 à 12:12
Salut,
merci pour vos rèponses, mais je vois pas comment je peux utiliser les fonctionsfopen dans ce cas de fiqure??
je fais comment
merci
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
26 févr. 2009 à 13:38
En fait, pour ne pas ouvrir le fichier à chaque fois, il faudrait que tu stockes quelque part ton ifstream, ton FILE* ou encore ton handle de fichier Win32. Et tu réutilises ça au lieu de faire un constructeur de ifstream, un fopen, un CreateFile à chaque appel de GetidRegion.

Concernant ton problème, tu as 20 Go de régions ? Tu as donc 20 Go d'une structure sérialisée de taille fixe ?

Si oui, tu as seekg/seek/SetFilePointer qui peut beaucoup t'aider. Si tu avais des structures triées par exemple, tu pourrais faire une recherche dichotomique dans ton fichier. Si tu avais des structures avec des ids qui se suivent (0, 1, 2, 3...) , tu pourrais tomber directement sur la bonne structure. Si tu avais des grosses structures non triées, tu pourrais faire un fichier d'index (id -> position dans le fichier), voir conserver cet index en mémoire.

Quel taille fait un Region ?
Que fait ta fonction ? Renvoyer une fonction à partir de son id ?
Tes structures sont triées ?
...

Détaille plus ton problème.
0