infodaoudi
Messages postés117Date d'inscriptionvendredi 10 février 2006StatutMembreDernière intervention30 mars 2012
-
21 févr. 2009 à 18:01
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDerniè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))))
{
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 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.
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 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 ?
...