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.
Voila ma question est donc :
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
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); }
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
Partager