Je travaille sur du code pour un cluster faiblement couplé. Pour obtenir des performances optimales pendant les tâches, le cluster remappe ses données chaque fois qu'un enfant entre ou sort. Cela sera éventuellement rendu optionnel, mais pour l'instant il effectue son équilibrage de données par défaut. Mon équilibrage consiste simplement à s'assurer que chaque enfant n'a jamais plus que le nombre moyen de fichiers par machine, plus un. Le plus un est pour le reste si la division n'est pas propre. Et puisque le reste sera toujours inférieur au nombre d'enfants [sauf 0 cas, mais nous pouvons exclure que], les enfants après un équilibrage auront au plus avg + 1.Algorithme de distribution équilibrée
Tout semble bien, jusqu'à ce que je réalise mon algorithme est O (n!). Descendez la liste des enfants, découvrez la moyenne, le reste, qui en a trop et qui en a trop peu. Pour chaque enfant dans la liste trop, passez par la liste, envoyez à chaque enfant qui a trop peu.
Y a-t-il une meilleure solution à cela? Je pense qu'il doit y avoir.
Edit: Voici quelques psuedocode pour montrer comment je tirais O (n!):
foreach (child in children) {
if (child.dataLoad > avg + 1) {
foreach (child2 in children) {
if (child != child2 && child2.dataLoad < avg) {
sendLoad(child, child2)
}
}
}
}
Edit: O (n^2). Foreach n, n => n * n => n^2. Je suppose que je n'ai pas eu assez de café ce matin! ;)
À l'avenir, je voudrais passer à une méthode de distribution plus flexible et résiliente [poids et hibernation], mais pour l'instant, une distribution uniforme des données fonctionne.
foreach (enfant chez les enfants) si (child.dataLoad> avg + 1) foreach (enfant2 chez les enfants) if (enfant! = Enfant2 && enfant2.dataLoad