Java 用于在多个辅助线程中平衡负载的算法
我有一个从key1到keyn的HashMap,每个键的值是一个对象列表,每个键上有不同数量的对象 我还知道对象的总数(分布在各个键之间) 我的目标是将数据加载到T线程中,K作为每个线程中的平均记录数 约束: 单个键的对象列表应转到single thread。(或无法拆分)。 但是,我们可以使用不同的键对不同的记录列表进行分组 是否有任何经过验证的算法正在执行相同的任务 例如: 总尺寸为=1000Java 用于在多个辅助线程中平衡负载的算法,java,algorithm,Java,Algorithm,我有一个从key1到keyn的HashMap,每个键的值是一个对象列表,每个键上有不同数量的对象 我还知道对象的总数(分布在各个键之间) 我的目标是将数据加载到T线程中,K作为每个线程中的平均记录数 约束: 单个键的对象列表应转到single thread。(或无法拆分)。 但是,我们可以使用不同的键对不同的记录列表进行分组 是否有任何经过验证的算法正在执行相同的任务 例如: 总尺寸为=1000 请求映射= k1->100 k2->50 k3->200 k4->250 k5->150 k6->8
请求映射= k1->100
k2->50
k3->200
k4->250
k5->150
k6->80
k7->60
k8->90
k9->20
现在输出可以是:
T1=k4(250)
T2=k3+k2(250)
T3=k1+k5(250)
T4=k6+k7+k8+k9(250)
这被称为where
V=总大小/线程数
,或者执行调度系统经常执行的操作:按大小对块进行排序,将最大的发送到线程1,将下一个最大的发送到线程2,等等。当线程N完成时,它将获得下一个块(剩余的最大块),等等。不保证是最优的,通常足够好,并且经常,如果无法准确估计工作负载,那就更好了。感谢您的评论,不幸的是,我需要提供启动线程之前所需的总线程数。我在这里的逻辑是,对密钥大小映射进行排序(如您所说),然后将其中最大的一个作为K,然后在集合的其余部分中搜索合适的匹配项。