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 : 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);
}
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