我正在为一个松散耦合的集群编写一些代码。为了在作业期间实现最佳性能,我让集群在每次子进程进入或退出时重新映射其数据。这将最终成为可选项,但目前默认情况下它会执行其数据平衡。我的平衡基本上只是确保每个子进程永远不会拥有超过每台机器上平均文件数加1的文件数。如果除法不干净,那么加1是为了余数。由于余数始终小于子进程数量[除0之外],因此经过平衡后的子进程最多只有avg + 1个文件。
一切看起来都很好,直到我意识到我的算法是O(n!)。按照子进程列表,找到平均值、余数、谁有太多和谁有太少。对于太多名单中的每个子进程,在列表中进行遍历,发送给每个有太少的子进程。
这个问题是否有更好的解决方案?我觉得一定有。
编辑:以下是一些伪代码,展示了如何推导出O(n!):
一切看起来都很好,直到我意识到我的算法是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)。对于每个n,n => n*n => n^2。我猜今天早上我喝的咖啡不够! ;)
将来我想采用更灵活、更有弹性的分配方法[权重和启发式算法],但现在,数据的均匀分布就可以了。