我工作的松耦合集群一些代码。为了在作业期间实现最佳性能,每次儿童进入或退出时,我都会重新映射其数据。这将最终成为可选项,但现在它默认执行数据平衡。我的平衡基本上只是确保每个孩子的平均数不会超过每台计算机的平均数量,再加上一个。如果师不干净,则剩余的一个是余下的。而且,由于其余的将始终少于孩子的数量[0除外情况,但我们可以排除],平衡后的孩子将有至多平均+ 1均衡分配算法
似乎一切都很好,直到我意识到我的算法是O(n!)。记下孩子的名单,找出平均数,剩余数,谁有太多,谁又少。对于太多列表中的每个孩子,都要经过列表,发送给每个孩子太少的孩子。
是否有更好的解决方案呢?我觉得必须有。
编辑:下面是一些伪代码,以显示我是如何得到的O(N!):
foreach (child in children) {
if (child.dataLoad > avg + 1) {
foreach (child2 in children) {
if (child != child2 && child2.dataLoad < avg) {
sendLoad(child, child2)
}
}
}
}
编辑:为O(n^2)。 Foreach n,n => n * n => n^2。我猜我今天早上没有足够的咖啡! )
在未来,我想移动到更柔性和弹性的分配方法[重量和hueristics],但就目前而言,数据的均匀分布的工作原理。
的foreach(孩子的孩子) 如果(child.dataLoad>平均+ 1) foreach(child2在儿童) if(child!= child2 && child2.dataLoad
2008-09-26 14:18:07