外排序
外排序是一种处理极大量以及海量数据的排序方法,适用于数据量大到无法完全加载到内存的情况。外排序通常采用”排序-归并“的策略,在面对海量数据的时候,会将数据分块处理并存储在外部存储的介质例如磁盘上,然后依次将这些数据读入内存并进行排序。
实际上外排序可以看成:将内存作为排序的过渡区间,读入内存主要进行分块数据的排序操作,其他时候数据是放在外部存储介质中进行保存的。
外归并排序
外归并排序是外排序的典型例子,它使用归并排序的思想,执行先排序再归并的操作,从而进行所有数据的排序。这里我们假设总共1GB的数据需要进行排序,而内存只有100MB,它按照如下方法操作:
- 读入100MB数据进入内存中,将其进行排序(常规排序即可)
- 将排序完成的数据重新写入磁盘
- 进行1与2的过程直到1GB的数据都分次排序完成
- 按照归并排序来进行所有数据的合成与排序(这里通常使用多路归并算法,K路归并利用优先[[队列]]或者堆来选择当前最小的元素,依次输出到最终的结果文件中)
外排序不仅仅只有外归并排序这一种算法,但这里只对其进行简单介绍,如果以后有时间将会介绍其他几种算法。另外还有外分配排序,其原理类似于内排序中的桶排序。在归并排序和桶排序之间存在数学上的某种对偶性。此外还有一些不耗费附加磁盘空间的原地排序算法。
外排序的特点
-
I/O密集型:由于涉及大量的读写操作,外排序的性能很大程度上取决于磁盘I/O的效率。
-
适用于大数据集:外排序能够处理超大规模的数据集,这些数据集远超出内存的容量限制。