思考
1.归并、外排 2.多线程 RecursiveTask
测试生成文件代码
/***
*@author dongsheng
*@date 2019/1/18 22:58
*@Description:
*@version 1.0.0
*/
public class GenerateNumber {
private static final String filePath="F:/file_test/data1.txt";
public static void main(String[] args) throws IOException {
//随机生成数据
Random random = new Random();
try (PrintWriter out = new PrintWriter(new File(filePath))) {
long beginTime = System.currentTimeMillis();
System.out.println("beginTime:"+beginTime);
for (int i = 0; i < 1_000_000; i++) {
out.println(random.nextInt());
if (i % 10000 == 0)
out.flush();
}
System.out.println("endTime:"+(System.currentTimeMillis()-beginTime));
}
}
}
排序代码
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
/***
*@author dongsheng
*@date 2019/1/18 22:58
*@Description:
*@version 1.0.0
*/
public class SortByForkjoin {
private static final String filePath="F:/file_test/data1.txt";
private static final String afterFilePath="F:/file_test/data1-sort.txt";
public static void main(String[] args) throws Exception {
ForkJoinPool pool = new ForkJoinPool();
/***
* 1.从文件中读取内存容量可处理的数据量 ,拆分为多个部分排序的文件
* 2.每100_000条数据为一个文件
* */
int size = 100_000;
int[] array = new int[size];
BufferedReader reader = new BufferedReader(new FileReader(filePath));
String line = null;
int i = 0;
int partition = 0;
/***
* 1.拆分的部分文件名list,后面归并部分文件需要用到它
* 2.每size条数据,排序后,放到一个文件
* */
List<String> partFiles = new ArrayList<>();
while ((line = reader.readLine()) != null) {
arr