大文件内容排序,多路归并排序算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 list = FileUtil.listFiles("E:\\log\\test");

mergeFile(list, "e:/log/testMergeSort.txt");

}

public static boolean mergeSort(List originFileList, String outPutFilePath, String tempPath) throws Exception {

("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 splitFileFileList = FileUtil.listFiles(tempPath);

//合并文件

FileUtil.createFile(outPutFilePath);

Set emptySet = new HashSet();

FileUtil.writeFile(outPutFilePath, emptySet, false);//若文件有内容,把文件清空

mergeFile(splitFileFileList, outPutFilePath);

("MergeSort end, take time {}S", (System.currentTimeMillis() - beginTime) / 1000 + "" );

//删除拆分临时文件

System.gc();

List listFiles = FileUtil.listFiles(tempPath);

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 fileList, String tempPath) throws Exception { int fileNum = 1;

String line = "";

/*采用默认的String字典比较器, 自动排序*/

//SortedSet set = new TreeSet(new StringInfoComparator());

SortedSet set = new TreeSet();

相关文档
最新文档