salut,
ya beaucoup de choses qui vont pas:
- tu ne définis pas c'est quoi boucle1 (idem les autres boucles): quel est son contenu?
- BOCULE2 where id > BOUCLE1.id, la requete me parait horrible: si boucle1.id vaut 0, tu vas récupérer 74 enregistrements dans boucle2!! et 73 enregistrements dans boucle3: idem tu récupères un enregistrement que tu as déjà récupéré (dans boucle2).
A beaucoup d'égards c'est pas bon:
* tu récupères plusieurs fois le même enregistrement
* tu vas traiter plusieurs fois le même enregistrement et ta fonction est couteuse...
* tu récupères ce lot d'enregistrement en boucle! (idem on sein de boucle 2, à la fin de ton programme, tu auras récupéré 74 fois ton dernier enregistrement...)
on ne sait pas quel id tu passes à tes boucles, ni quand tu t'arrêtes, ni ce qu'est boucle.id
c'est dur de deviner c'est quoi idmax que tu obtiens.
En revanche, 86 296 940/120 = 17259390, c'est environ ton idmax.
120=5! vient du fait que tu génères en fait des combinaisons de 5el parmi 15 et non 5 arrangements parmi 15.
par exemple pour les enregistrements <a,b,c,d,e>, tu ne considères pas <b,a,c,d,e>,... (idem toutes les permutations possibles). C'est le cas dans ton code ou tes enreigstrements sont ordonnés par ordre croissant (id > boucle.id)
edit:
j'ajoute:
ci-dessous un algo plus proche de ce qu'on attend d'un truc parallel
- Code: Tout sélectionner
/**
* unos contient les index dans le tableau enregistrements pour lesquels l'enregistrement vaut 1
* zeros contient les ... vaut 0
*/
fonction thread(threadId)
unos = tableau d'entier
zeros = tableau d'entier
//si thread 0, lit les records 0,5,10...
//si thread 1, lit les records 1,6,11,...
pour idx = threadId, idx < 75; idx += 5
enregistrement = enregistrements[idx]
//traiter est ta fonction couteuse qui doit retourner 0 ou 1
si 0 == traiter(enregistrement)
zeros.push(idx)
sinon
unos.push(idx)
retourner unos, zeros
fonction main()
enregistrements = select * from table;
result = tableauDeResultat
#parallel
pour threadId = 0 à 4
result[threadId] = thread(threadId); //result[threadId] contient unos et zeros du thread correspondant
//on merge tout le monde
unos = tableau
zeros = tableau
pour threadId = 0 à 4
unos = unos.concat(result[threadId].unos)
zeros = zeros.concat(result[threadId].zeros)