杨建荣的学习笔记

每天坚持一点点,个人微信公众号: jianrong-notes 个人邮箱:jeanrock@126.com

  • 博客访问: 13381837
  • 博文数量: 1502
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-14 23:24
  • 认证徽章:
个人简介

每日发文,或技术、或总结,偶有日间小事也以为记,谓之学习笔记,成年累月1400多天,中间几乎没有间断,要旨只有一个:学习交流,共同进步 。 学习笔记精华整理,个人新书《Oracle DBA工作笔记》已开售,在京东,当当,亚马逊,淘宝,天猫均有售,欢迎选购。

文章分类

全部博文(1502)

文章存档

2018年(116)

2017年(321)

2016年(358)

2015年(360)

2014年(278)

2013年(48)

2012年(21)

分类: Java技术

2018-04-03 12:04:01

如果给定一批任务,比如有500个任务,需要在尽可能快的时间内做完。

如果串行是肯定不行的。我们可以考虑并行策略,但是开了并行,怎么能够充分利用资源比较好呢。

这个问题在多年前做数据迁移的时候,逼得没办法,当时用shell写了一个算法,可以参考这一篇。

海量数据迁移之使用shell启用多个动态并行(r2笔记81天)

但是在自动化运维平台中,我希望这个操作能够更加通用,所以在程序端实现是极好的。

我先打算用Java来实现,然后转义为Python版本,已经写了大半部分,还没有调试好,就先不放出来了,我把我的思路说一下。

假设有下面的一些任务,第一位是序号,第二位是任务需要花费的时间。

假设分为4个并行,即4组执行任务,每组执行任务该如何分配呢。

(1, 10),

(2, 30),

(3, 20),

(4, 50),

(5, 60),

(6, 30),

(7, 20),

(8, 10),

(9, 20),

(10,50),

所以放眼任务调度的方向上,我们都希望并行,但是绝大多数情况下,并行的效果其实不好,一种最重建的情况就是前半段在并行,后半段基本在等待。

假设我们按照如下的思路来完成,前四个元素是每组的一个元素,然后每组查看累计值的最小值,然后依次加入后续的元素。按照这种方法,得到的任务安排如下:

1 10 60 70

2 30 20 20 70

3 20 30 50 100

4 50 10 60

明显这种方法有缺点,因为我们无法预知后续元素的大小,所以任务分配很不均匀。

所以我们需要排序,按照最大值,最小值的方式排序。

这样一来,最大的4个元素分别位列每组的第一个元素。然后依次取得每组累计值的最小值,加入后续的元素。

分配情况如下:

1 50 20 70

2 60 20 80

3 50 20 10 80

4 30 30 10 70

明显好很多。

阅读(2904) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册