Bonjour,
J'ai fait un programme qui tente d'identifier des sous-ensembles de clients similaires au sein de gros fichiers clients dotés d'une structure bien spécifique.
En gros, dans deux boucles imbriquées j'évalue le degré de similitude existant entre chaque clients du fichier puis j'écris les paires de clients suffisament similaires au sein d'une base MySQL.
J'utilise beaucoup de choses gourmandes en mémoire, des Vectors, des permutations, des combinaisons etc... Ce qui donne une complexité énorme à mon algo. Pour info, le traitement complet pour un fichier de 85000 clients dure 2 jours.
Les boucles imbriquées ressemblent à ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 for(int i = 0; i < vClients.size(); i++){ for(int j = i + 1; j < c.vClients.size(); j++){ // Si clients différents et comparaison non effectuée EvaluerSimilitude(vClients.get(i);vClients.get(j)); .... }}
Lorsque je lance le traitement sur un petit fichier disons de 5000 clients, l'ordre des numéros des paires de clients écrites dans ma base est cohérent avec le parcours du fichier initial. J'ai en sortie quelque chose du style :
client 1 / client 65
client 78 / client 89
client 4567 / client 234
client 4567 /client 235 etc...
Ce qui est bizarre c'est que sur les traitement longs, où plusieurs milliards de comparaison sont faite j'ai quelque chose comme ça en sortie :
client 56787 / client 34
client 102 / 3
client 3456 / client 37890
client 2/3 etc...
Pourquoi les paires écrites ne le sont-elle pas dans l'ordre du parcours du fichiers? Est-ce dû à des optimisations faites par le compilateur?
Merci!
Partager