fopen vs open question rapidité
Bonjour,
Voila étant en dernière année de master informatique, on nous demande de coder des algorythmes de découverte de réseaux.
On se sert donc d'un fichier de la forme :
0 1
0 2
1 2
...
Où chaque lignes représente un lien et chaque numéro représente un noeud du réseau.
Les algos marchent bien pas de souci pour ça le seul souci c'est la rapidité : pour un réseau de 117 millions de liens (donc un fichier avec 117 millions de lignes), l'algo ci-dessous met 5 minutes et 20 secondes rien qu'à rentrer le fichier en mémoire RAM, la où mon prof met lui 26 secondes.
J'ai un i5 avec 6 GO de RAM, un SSD et les 4 coeurs montent tous à 50% de charge quand l'algo ci-dessous tourne.La lecture disque semblerait se faire à 2 Mio/s.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
void printSize(char* input){
FILE* f;
char c;
unsigned long n1,n2,nbVertices=0,nbEdges=0;
if((f = fopen(input,"r"))==NULL){
perror("File not found");
exit(1);
}
while((c=fgetc(f))!=EOF){ //case where first two lines begin with %
if(c=='%')
while((c=fgetc(f))!='\n');
else
break;
}
fseek(f,-1,SEEK_CUR); //one char has been read, got to go back
while(fscanf(f,"%ld %ld",&n1,&n2)!=EOF){
nbVertices = max(nbVertices,n1,n2);
nbEdges++;
}
nbVertices++; //adding vertice 0
printf("\n%ld vertices %ld edges",nbVertices, nbEdges);
} |
Voila ma question est donc :
Remplacer fopen() par open() va-t il améliorer la rapidité ?
Ou sinon si vous avez d'autres idées pour améliorer la rapidité de mise en mémoire principale...
D'autres fonctions que open?()
Création de threads ou processus pour essayer d'aller plus vite?
gcc -09 change t-il quelque chose à la done?
...
Merci beaucoup