【算法】对一个20GB大的文件排序
来源:互联网 发布:安卓数据查询源码 编辑:程序博客网 时间:2024/04/29 06:58
设想你有一个20GB的文件,每行一个字符串,说明如何对这个文件进行排序。
内存肯定没有20GB大,所以不可能采用传统排序法。但是可以将文件分成许多块,每块xMB,针对每个快各自进行排序,存回文件系统。
然后将这些块逐一合并,最终得到全部排好序的文件。
外排序的一个例子是外归并排序(External merge sort),它读入一些能放在内存内的数据量,在内存中排序后输出为一个顺串(即是内部数据有序的临时文件),处理完所有的数据后再进行归并。[1][2]比如,要对900MB的数据进行排序,但机器上只有100 MB的可用内存时,外归并排序按如下方法操作:
- 读入100 MB的数据至内存中,用某种常规方式(如快速排序、堆排序、归并排序等方法)在内存中完成排序。
- 将排序完成的数据写入磁盘。
- 重复步骤1和2直到所有的数据都存入了不同的100 MB的块(临时文件)中。在这个例子中,有900 MB数据,单个临时文件大小为100 MB,所以会产生9个临时文件。
- 读入每个临时文件(顺串)的前10 MB( = 100 MB / (9块 + 1))的数据放入内存中的输入缓冲区,最后的10 MB作为输出缓冲区。(实践中,将输入缓冲适当调小,而适当增大输出缓冲区能获得更好的效果。)
- 执行九路归并算法,将结果输出到输出缓冲区。一旦输出缓冲区满,将缓冲区中的数据写出至目标文件,清空缓冲区。一旦9个输入缓冲区中的一个变空,就从这个缓冲区关联的文件,读入下一个10M数据,除非这个文件已读完。这是“外归并排序”能在主存外完成排序的关键步骤 -- 因为“归并算法”(merge algorithm)对每一个大块只是顺序地做一轮访问(进行归并),每个大块不用完全载入主存。
0 0
- 【算法】对一个20GB大的文件排序
- 设想你有一个20GB的文件,每一行一个字符串。请说明将如何对这个文件进行排序。
- 可以对大文件排序的排序算法
- 对大对象进行排序的算法
- 9.11排序与查找(四)——20GB的文件,每一行一个字符串,说明如何将这个文件进行排序
- 对一个无法一次读入内存的大文件进行排序的代码实例
- 学长写的一个处理大数据多个文件的排序算法
- Python读取大文件(GB)
- Python读取大文件(GB)
- 在Linux下处理超过2GB的大文件
- C# 读取大文件 (可以读取3GB大小的txt文件)
- C# 读取大文件 (可以读取3GB大小的txt文件)
- 对大文件的断点续传
- 一个文件中有40亿个整数,每个整数为四个字节,内存为1GB,写出一个算法:求出这个文件里的整数里不包含的一个整数
- 一个文件中有40亿个整数,每个整数为四个字节,内存为1GB,写出一个算法:求出这个文件里的整数里不包含的一个整数。
- 排序算法--对公司员工年龄的排序
- 选择排序算法---对一个数组进行选择排序
- 冒泡排序算法----对一个数组进行冒泡排序
- WNDCLASS结构中cbWndExtra数据成员的作用
- Spring BeanFactory实例化Bean的过程
- 关于int数据转换float数据出现输出0.0000的问题
- linux 下tar 打包分割文件和解压文件
- UIView属性clipsToBounds的使用
- 【算法】对一个20GB大的文件排序
- Android SDK在线更新镜像服务器
- SQL 拼接表名并调用 并取返回值
- 样式表写法
- 百度API 定位 返回当前详细位置
- ubuntu下查看windows文件乱码
- Java通过XML Schema校验XML
- Web前端开发工程师--面试要求
- UML软件建模学习与开发基本概念汇总