大文件内容排序,多路归并排序算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
package com.igo.util.file;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import org.slf4j.Logger;
/**
*
* 外部排序指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,
* 需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的。* 外部排序最常用的算法是多路归并排序,即将原文件分解成多个能够一次性装人内存的部分,
* 分别把每一部分调入内存完成排序。然后,对已经排序的子文件进行归并排序。* @author ZhaoWeikai
* Company:
* 2010-12-23 下午02:25:00
*/
public class MergeSort {
private static final Logger log =
org.slf4j.LoggerFactory.getLogger(MergeSort.class);
/** 拆分大小, 单位:行*/
private static int SPLIT_SIZE = 100000;
public static void main(String[] args) throws Exception {
List
mergeFile(list, "e:/log/testMergeSort.txt");
}
public static boolean mergeSort(List
("mergeSort start.............................................");
FileUtil.createDir(tempPath);
if (originFileList == null || originFileList.size() == 0) {
log.warn("Warning: mergeSort failure, originFileList is empety");
return false;
}
long beginTime = System.currentTimeMillis();
//拆分文件
splitFile(originFileList, tempPath);
("Start Sort and Merge Files, Maybe it takes long time....");
List
//合并文件
FileUtil.createFile(outPutFilePath);
Set
FileUtil.writeFile(outPutFilePath, emptySet, false);//若文件有内容,把文件清空
mergeFile(splitFileFileList, outPutFilePath);
("MergeSort end, take time {}S", (System.currentTimeMillis() - beginTime) / 1000 + "" );
//删除拆分临时文件
System.gc();
List
int delNum = 0;
for (File f : listFiles) {
f.delete();
delNum ++;
}
("delete temp files:{}", delNum );
return true;
}
/**
* 分割文件
* @param inputPath
* @return split file num
* @throws Exception
*/
private static int splitFile(List
String line = "";
/*采用默认的String字典比较器, 自动排序*/
//SortedSet
SortedSet