1、问题场景
例如:当前磁盘2T,内存16G,文件大小500G。现在需要对500G的大文件进行排序,并存道另一个文件中。
抽象:当前有包含10000行数的文件,再只能使用长度为1000的数组的前提下,对文件中的数据进行排序,并存道另一个文件中。
2、问题分析
首先,数据的总量大于了所能使用的内存数据结构的容量,所以肯定不能完全通过内存排序。因此需要采用一种分治的思想来实现全局排序。
(1)数组总量10000,数组容量1000,所以可以分十次读取数据,每次读取1000条数据,再内存中对1000条数据进行排序。
(2)单次排完序的数据写入磁盘临时文件。总供会有10个局部有序的磁盘文件。
(3)同时打开10个磁盘文件,创建reader。每个磁盘文件都读入第一行数据,即局部最小的数据。
(4)找到10个局部最小数据中的最小值。
(5)对每个磁盘文件,判断当前最小值是否等于全局最小值。如果等于则写出,并获取下一行数据,继续比较。
(6)当所有文件都比较并输出完之后,重新计算当前10个局部最小数据中的最小值。继续比较输出,直到所有磁盘文件全部读完。
(7)此时输出的文件就是一个全局有序的文件。
3、生成测试数据
public class CreateTestData {
public static void main(String[] args) throws IOException {
String filePath = "C:\\Users\\yangshen\\code\\java\\stu-project\\src\\main\\resources\\input.txt";
BufferedWriter writer = new BufferedWriter(new FileWriter(filePath));
Random random = new Random(1);
int num = 0;
while (num < 10000) {