Sto lavorando su un codice per un cluster liberamente accoppiato. Per ottenere prestazioni ottimali durante i lavori, ho il cluster rimappare i suoi dati ogni volta che un bambino entra o esce. Questo alla fine sarà reso opzionale, ma per ora esegue il bilanciamento dei dati per impostazione predefinita. Il mio bilanciamento consiste fondamentalmente nel fare in modo che ogni bambino non abbia mai più del numero medio di file per macchina, più uno. Il più uno è per il resto se la divisione non è pulita. E dal momento che il resto sarà sempre essere inferiore al numero di bambini [ad eccezione di 0 caso, ma possiamo escludere che], bambini dopo un bilanciamento avranno al massimo avg + 1.Algoritmo di distribuzione bilanciato
Tutto sembra in ordine, fino a quando mi sono reso conto il mio algoritmo è O (n!). Scendi nell'elenco dei bambini, scopri la media, il resto, chi ne ha troppi e chi ne ha troppo pochi. Per ogni bambino nella troppa lista, scorrere l'elenco, inviare ad ogni bambino che ne ha troppo pochi.
Esiste una soluzione migliore? Sento che deve esserci.
Edit: Ecco alcune psuedocodarlo di mostrare come ho derivato 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. Immagino di non aver bevuto abbastanza caffè stamattina! ;)
In futuro mi piacerebbe passare a un metodo di distribuzione più flessibile e resiliente [pesi e hueristics], ma per ora funziona una distribuzione uniforme dei dati.
foreach (bambino nei bambini) se (child.dataLoad> avg + 1) foreach (child2 nei bambini) if (child! = Child2 && child2.dataLoad