Bonjour,
Voilà, je dispose d'un vecteur d'éléments (des items avec des listes d'attributs).
Un score de 1-100 sous forme de short est calculé pour chaque couple (x,y) de ce vecteur. de façon à obtenir
(element_1, element_2) = 24;
(element_1, element_3) = 50;
(element_1, element_4) = 10;
...
Puisque f( x ,y) est égal à f( y, x), je compare le premier élément à tous, le second à tous sauf le premier, le 3e à tous sauf les deux premiers... Bref chaque element d'index x du vecteur est comparé à tous les éléments dont l'index est compris entre x+1 et n. Afin d'éviter le recalcul (en gros si le résultat était sous forme de matrice, on ne calculerait que la diagonale haut/droite).
Pour accélérer les calculs, j'ai créé un pool consommant des workitems. Un workItem contient le vecteur d'élément à comparer, et simplement l'index de départ plus une ou deux ressources partagées.
Mon code ressemble à ceci :
Pour le moment cela marche très bien, mais vu la quantité d'élément que peut contenir le vecteur source (50'000 items). J'aurai besoin d'écrire les résultats des couples dans un fichier au fur et à mesure afin de ne pas avoir à tout stocker en mémoire car le nombre de valeurs est joliment de l'ordre de grandeur (n^2) / 2.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 void computeAllAttributeSim( const QVector<itemAttributes*> itemsWithAttributes, const QVector<float> weights ) { QThreadPool pool; pool.setMaxThreadCount(2); for( int i = 0; i < itemsWithAttributes.size(); i++ ) { //chaque workitem part de i, et calcule (i, i+1), (i,i+2),... (i, i+n) workItem *item = new workItem( itemsWithAttributes, weights, i ); pool.start(item); } pool.waitForDone(); }
Donc lorsqu'un workitem est fini, il me faudrait pouvoir écrire les valeurs qu'il a calculées dans un fichier, le problème c'est que l'ordre dans lequel j'écris doit être identique à celui du vecteur (c'est une contrainte du programme qui va lire mon fichier généré).
Donc si 4 workitems tournent en même temps, je dois pouvoir les écrire dans l'ordre de création quand ils ont fini, même si le 3e finit avant le premier.
En fait je sèche sur la façon dont je pourrai gérer cette écriture de résultat efficacement sans massacrer les performances à grand coups de mutex dans tous les sens...
Si quelqu'un a une piste, c'est bienvenu...
Partager