超大数据排序


1、分

内存中维护一个极小的核心缓冲区memBuffer,将大文件bigdata按行读入,搜集到memBuffer满或者大文件读完时,对memBuffer中的数据调用内排进行排序,排序后将有序结果写入磁盘文件bigdata.xxx.part.sorted. 循环利用memBuffer直到大文件处理完毕,得到n个有序的磁盘文件


2、合

现在有了n个有序的小文件,怎么合并成1个有序的大文件?把所有小文件读入内存,然后内排?(⊙o⊙)… no!

利用如下原理进行归并排序:



贴代码:

产生大数据文件

public class Test {

public static void main(String[] args)throws IOException {

File file =new File("E:/排序/source.txt");

        int numCount =10000000;

        Random r =new Random();

        if (file.exists()) file.delete();

        FileWriter fw =new FileWriter(file);

        for (int i =0; i < numCount; i++) {

fw.write(r.nextInt() +"\n");

        }

fw.close();

    }

}


2、排序

说明  此类从网上抄写  ,合并有mergeSort 和 merge    
mergeSort方法感觉逻辑有点绕, 即另外实现了merge 方法

public class Sort {

public static void main(String[] args)throws IOException {

File file =new File("E:/排序/source.txt");

        BufferedReader fr =new BufferedReader(new FileReader(file));//源数据文件读取。

        final int SIZE =10000;//这里是定义我们将源文件中以10000条记录作为单位进行分割。

        int[] nums =new int[SIZE];//临时存放分割时的记录

        List fileNames =new ArrayList();//保存所有分割文件的名称

        int index =0;

        while (true) {

String num = fr.readLine();//从原文件中读取一条记录

            if (num ==null) {//如果读取完毕后,进行一次排序并保存

                fileNames.add(sortAndSave(nums, index));

break;

            }

nums[index] = Integer.valueOf(num);

            index++;

            if (index == SIZE) {//当nums里面读的数字到达长度边界时,排序,存储

                fileNames.add(sortAndSave(nums, index));//sortAndSave是将nums中前index条记录先快速排序,然后存入文件,最好将文件名返回。

                index =0;//重置index

            }

}

fr.close();

        merge(fileNames);

    }

public static void merge(List fileNames)throws IOException {

List list =new ArrayList<>(fileNames.size());

        List brs =new ArrayList<>(fileNames.size());

        for (String fileName : fileNames) {

File file =new File(fileName);

            BufferedReader br =new BufferedReader(new FileReader(file));

            String num = br.readLine();

            brs.add(br);

            list.add(Integer.valueOf(num));

        }

File resultFile =new File("E:/排序/result.txt");

        BufferedWriter bw =new BufferedWriter(new FileWriter(resultFile));

        while (fileNames.size() >0) {

int min = Collections.min(list);

            bw.write(min +"\n");

            int i = list.indexOf(min);

            String num = brs.get(i).readLine();

            if (num ==null) {

String fileName = fileNames.get(i);

                File file =new File(fileName);

                if (file.exists()) {

file.delete();

                }

fileNames.remove(i);

                brs.get(i).close();

                brs.remove(i);

                list.remove(i);

            }else {

list.set(i, Integer.valueOf(num));

            }

}

bw.close();

    }

public static StringsortAndSave(int[] nums, int size)throws IOException {

quicksort.sort(nums, 0, size -1);

        String fileName ="E:/排序/sort" + System.nanoTime() +".txt";

        File rf =new File(fileName);

        BufferedWriter bw =new BufferedWriter(new FileWriter(rf));

        for (int i =0; i < nums.length; i++) bw.write(nums[i] +"\n");

        bw.close();

        return fileName;

    }

public static void mergeSort(List fileNames)throws IOException {

List tempFileNames =new ArrayList();

        for (int i =0; i < fileNames.size(); i++) {

String resultFileName ="E:/排序/sort" + System.nanoTime() +".txt";

            File resultFile =new File(resultFileName);

            tempFileNames.add(resultFileName);

            BufferedWriter bw =new BufferedWriter(new FileWriter(resultFile));

            File file1 =new File(fileNames.get(i++));

            BufferedReader br1 =new BufferedReader(new FileReader(file1));

            if (i < fileNames.size()) {

File file2 =new File(fileNames.get(i));

                BufferedReader br2 =new BufferedReader(new FileReader(file2));

                int num1 =0;

                int num2 =0;

                boolean isFirst =true;

                boolean firstNext =true;

                String numVal1 =null, numVal2 =null;

                for (; ; ) {

if (isFirst) {

numVal1 = br1.readLine();

                        numVal2 = br2.readLine();

                        num1 = Integer.valueOf(numVal1);

                        num2 = Integer.valueOf(numVal2);

                        isFirst =false;

                    }else if (firstNext)

numVal1 = br1.readLine();

else

                        numVal2 = br2.readLine();

                    if (numVal1 !=null && numVal2 !=null) {

if (firstNext) {

num1 = Integer.valueOf(numVal1);

                        }else {

num2 = Integer.valueOf(numVal2);

                        }

if (num1 < num2) {

bw.write(num1 +"\n");

                            firstNext =true;

                        }else {

bw.write(num2 +"\n");

                            firstNext =false;

                        }

}else {

if (numVal1 !=null) bw.write(numVal1 +"\n");

                        if (numVal2 !=null) bw.write(numVal2 +"\n");

break;

                    }

}

while (true) {

numVal2 = br2.readLine();

;

                    if (numVal2 !=null) bw.write(numVal2 +"\n");

else break;

                }

br2.close();

                file2.delete();

            }

while (true) {

String numVal1 = br1.readLine();

                if (numVal1 !=null) {

bw.write(numVal1 +"\n");

                }else break;

            }

br1.close();

            file1.delete();

            bw.close();

        }

int size = tempFileNames.size();

        if (size >1) {

mergeSort(tempFileNames);

        }else if (size ==1) {

File file =new File(tempFileNames.get(0));

            file.renameTo(new File("E:/排序/result.txt"));

        }

}

}

//快速排序

class quicksort {

public static void sort(int data[], int low, int hight) {

quicksort qs =new quicksort();

        qs.data = data;

        qs.sort(low, hight);

    }

public int data[];

    private int partition(int sortArray[], int low, int hight) {

int key = sortArray[low];

        while (low < hight) {

while (low < hight && sortArray[hight] >= key) hight--;

            sortArray[low] = sortArray[hight];

            while (low < hight && sortArray[low] <= key) low++;

            sortArray[hight] = sortArray[low];

        }

sortArray[low] = key;

        return low;

    }

public void sort(int low, int hight) {

if (low < hight) {

int result = partition(data, low, hight);

            sort(low, result -1);

            sort(result +1, hight);

        }

}

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容