数十亿数据(大量数据)全排序
问题
有数十亿的数据需要进行全排序,如何实现
(由于计算机内存有限,不能直接将所有数据加载到内存中进行排序)
参考方法
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. 也可以预先采样和统计,来确定桶的大小范围。桶数可以灵活调整。
通过构建适当数量的桶,可以“分而治之”逐步减少排序规模,实现对极大数据量的有效排序。