数十亿数据(大量数据)全排序问题

数十亿数据(大量数据)全排序

问题

有数十亿的数据需要进行全排序,如何实现
(由于计算机内存有限,不能直接将所有数据加载到内存中进行排序)

参考方法

1. 多路归并排序

1. Assume将数据均匀分布在1000个节点上,每个节点约100w条数据。

2. 在每个节点上,使用多线程对本地数据进行排序,生成有序文件。

3. 设置一个汇聚节点,从所有排序节点并行读取排序数据,使用优先队列结构,实现多路归并。

4. 从每个节点读取一条记录,比较找出序最小的放入优先队列。

5. 每次从优先队列弹出序最小元素,作为排序输出结果。

6. 再从该元素所在节点读取下一条记录,放入优先队列重复比对过程。

7. 直到所有节点数据依次读完,优先队列弹出的顺序就是全局排序结果。

8. 通过配置多线程,可以实现并行读取和合并,提高效率。

9. 也可以分批多路归并,每批合并好后写入文件,减少内存压力。

多路归并可以有效利用每个节点的本地排序结果,实现分而治之的全局排序。是处理大数据量排序的可行方案。

在这里插入图片描述

2. 桶排序

例如: 对于10亿个1到1,000,000之间的整数数据进行全局排序

1. 设置10000个桶,每个桶存储一定范围的数值。例如桶1存储1-100的值,桶2存储101-200的值,以此类推。

2. 根据数值将数据划分到对应的桶内。例如值23553放到桶236,值60000放到桶600。

3. 在每个桶内部,使用快速排序、归并排序等算法对数据进行排序。

4. 按照桶的顺序依次输出每个桶内部排序好的数据,最终得到全局有序序列。

5. 如果单个桶内的数据量过大,可以继续划分子桶,例如每个大桶再划分为10个子桶,提高排序效率。

6. 也可以预先采样和统计,来确定桶的大小范围。桶数可以灵活调整。

通过构建适当数量的桶,可以“分而治之”逐步减少排序规模,实现对极大数据量的有效排序。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值