外排序

外排序

外排序(External sorting)是指能够处理极大量数据的排序算法。通常来说,外排序处理的数据不能一次装入内存,只能放在读写较慢的外存储器(通常是硬盘)上。外排序通常采用的是一种“排序-归并”的策略。

在排序阶段,先读入能放在内存中的数据量,将其排序输出到一个临时文件,依此进行,将待排序数据组织为多个有序的临时文件。尔后在归并阶段将这些临时文件组合为一个大的有序文件,也即排序结果。

外归并排序

外排序的一个例子是外归并排序(External merge sort),它读入一些能放在内存内的数据量,在内存中排序后输出为一个顺串(即是内部数据有序的临时文件),处理完所有的数据后再进行归并。比如,要对900 MB的数据进行排序,但机器上只有100 MB的可用内存时,外归并排序按如下方法操作:

1.读入100 MB的数据至内存中,用某种常规方式(如快速排序、堆排序、归并排序等方法)在内存中完成排序。

2.将排序完成的数据写入磁盘。

3.重复步骤1和2直到所有的数据都存入了不同的100 MB的块(临时文件)中。在这个例子中,有900 MB数据,单个临时文件大小为100 MB,所以会产生9个临时文件。

4.读入每个临时文件(顺串)的前10 MB( 100 MB / (9块输入缓冲区 + 1块输出缓冲区))的数据放入内存中的输入缓冲区,最后的10 MB作为输出缓冲区。(实践中,将输入缓冲适当调小,而适当增大输出缓冲区能获得更好的效果)

5.执行九路归并算法,将结果输出到输出缓冲区。一旦输出缓冲区满,将缓冲区中的数据写出至目标文件,清空缓冲区。一旦9个输入缓冲区中的一个变空,就从这个缓冲区关联的文件,读入下一个10M数据,除非这个文件已读完。

这是“外归并排序”能在主存外完成排序的关键步骤 -- 因为“归并算法”(merge algorithm)对每一个大块只是顺序地做一轮访问(进行归并),每个大块不用完全载入主存。

性能分析

提高外排序效率应该主要着眼于减少外存信息的读写次数。

在一般情况下,对m个初始归并段进行k-路平衡归并时,归并的趟数

s=LOGk m (即以k为底以m为真数的对数)

可见,若减少m或者增加k可以减少归并的趟数,但是并不是k值的选择越大越好,如何选择k值是个综合考虑的问题。

多路平衡归并的实现

单纯增加k将导致增加内部归并排序的时间,若在进行k-路归并时利用“败者树”,则可使在k个记录中选出关键字最小的记录时仅需进行log2 k(以2为底以k为真数的对数,并且向上取整)。

"胜者树":每个非终端结点均表示其左、右孩子结点中的"胜者"。

"败者树":记下刚进行完的比赛的败者,而让胜者去参加更高一层的比赛。

为了防止在归并过程中某个归并段变空,可以在每个归并段中附加一个关键字为最大值的记录。当选出的"冠军"记录的关键字为最大值时,表明此次归并已完成。

优化性能

并行计算

1)、用多个磁盘驱动器并行处理数据,可以加速顺序磁盘读写。[4]

2)、在计算机上使用多线程,可在多核心的计算机上得到优化。

3)、使用异步输入输出,可以同时排序和归并,同时读写。

4)、使用多台计算机用高速网络连接,分担计算任务。[5]

提高硬件速度

1)、增大内存,减小磁盘读写次数,减小归并次数。

2)、使用快速的外存设备,比如15000 RPM的硬盘或固态硬盘。

3)、使用性能更优良个各种设备,比如使用多核心CPU和延迟时间更短的内存。

提高软件速度

1)、对于某些特殊数据,在第一阶段的排序中使用基数排序。

2)、压缩输入输出文件和临时文件。

时间: 2024-08-08 22:03:57

外排序的相关文章

数据结构:外排序-多路归并

外排序 外排序问题的出现,主要是因为内存不够.当需要排序的数据量过多,以至于无法一次性把所有的数据都放入内存,这导致了外排序问题的出现.解决大数据量排序的方法是:先分块排序,后进行块合并. 外排序步骤 把原数据分成几段读入内存,以至于每一块都可以完整的在内存中进行排序,排序好后,写入外部存储设备. 归并已排序好的数据块. 这就是归并排序在外排序中的应用. 对每块数据进行排序,可以使用各种内排序方法:快速排序.归并排序.堆排序等.这个比较简单,下面模拟一个对排序好的数据块进行归并的过程. #inc

20140528 归并排序 内排序 外排序

1.归并排序 2.内排序和外排序 外排序的一个例子是外归并排序(External merge sort),它读入一些能放在内存内的数据量,在内存中排序后输出为一个顺串(即是内部数据有序的临时文件),处理完所有的数据后再进行归并.比如,要对 900 MB 的数据进行排序,但机器上只有 100 MB 的可用内存时,外归并排序按如下方法操作: 读入 100 MB 的数据至内存中,用某种常规方式(如快速排序.堆排序.归并排序等方法)在内存中完成排序. 将排序完成的数据写入磁盘. 重复步骤 1 和 2 直

外排序   败者树   多路归并

一.外排序 排序按数据存在的位置不同分为内排序和外排序 内排序:数据都在内存中,选择合适的排序方法对数据进行排序,比如选择排序.快速排序等 衡量内排序的效率是数据的比较次数 外排序:数据无法全部加载到内存中,只能不断在外部存储器和内存中进行交换完成排序 衡量外排序的效率是内存与外村的交换次数 外排序是针对大文件的数据排序,内存中无法加载这个大文件,把这个文件分为k个小文件,分别排序后合并 http://blog.csdn.net/msdnwolaile/article/details/52084

数据结构与算法 代码整理:外排序法

外排序原理: 外排序就是能够处理极大量数据的排序算法.通常来说,外排序处理的数据不能一次性装入内存,只能放在读写较慢的外存储器(eg.硬盘)上,通常采用“排序-归并”策略. 算法性能分析: 参考:http://blog.chinaunix.net/uid-25324849-id-2182916.html 多路归并的实现: 败者树是树形选择排序的一种变形.若在双亲结点中记下刚进行完比赛中的败者,而让胜者去参加高一级的比赛,便可得到一颗“败者树”. 如下图a中,在败者树中,根节点ls[2]的双亲结点

内排序和外排序

内排序:指在排序期间数据对象全部存放在内存的排序. 外排序:指在排序期间全部对象太多,不能同时存放在内存中,必须根据排序过程的要求,不断在内,外存间移动的排序. 根据排序元素所在位置的不同,排序分: 内排序和外排序. 内排序:在排序过程中,所有元素调到内存中进行的排序,称为内排序.内排序是排序的基础.内排序效率用比较次数来衡量.按所用策略不同,内排序又可分为插入排序.选择排序.交换排序.归并排序及基数排序等几大类. 外排序:在数据量大的情况下,只能分块排序,但块与块间不能保证有序.外排序用读/写

经典算法题每日演练——第十八题 外排序

原文:经典算法题每日演练--第十八题 外排序 说到排序,大家第一反应基本上是内排序,是的,算法嘛,玩的就是内存,然而内存是有限制的,总有装不下的那一天,此时就可以来玩玩 外排序,当然在我看来,外排序考验的是一个程序员的架构能力,而不仅仅局限于排序这个层次. 一:N路归并排序 1.概序 我们知道算法中有一种叫做分治思想,一个大问题我们可以采取分而治之,各个突破,当子问题解决了,大问题也就KO了,还有一点我们知道 内排序的归并排序是采用二路归并的,因为分治后有LogN层,每层两路归并需要N的时候,最

bitmap、Trie、数据库索引、倒排索引、外排序、Mapreduce

Bitmap 问题给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?方案1:用位图/Bitmap的方法,申请512M的内存,一个bit位代表一个unsigned int值.读入40亿个数,设置相应的bit位,读入要查询的数,查看相应bit位是否为1,为1表示存在,为0表示不存在. 还可以扩展成2-Bitmap. Trie树 问题:有10个文件,每个文件1G,每个文件的每一行都存放的是用户的query,每个文件的query都可能

外排序 & 败者树 & 多路归并-学习

来来来,根据这篇文章,学一下败者树吧: http://blog.csdn.net/whz_zb/article/details/7425152 一.胜者树 胜者树的一个优点是,如果一个选手的值改变了,可以很容易地修改这棵胜者树.只需要沿着从该结点到根结点的路径修改这棵二叉树,而不必改变其他比赛的结果. 二.败者树 败者树是胜者树的一种变体.在败者树中,用父结点记录其左右子结点进行比赛的败者,而让胜者参加下一轮的比赛.败者树的根结点记录的是败者,需要加一个结点来记录整个比赛的胜利者.采用败者树可以

算法 排序lowB三人组 冒泡排序 选择排序 插入排序

参考博客:基于python的七种经典排序算法   [经典排序算法][集锦]     经典排序算法及python实现 首先明确,算法的实质 是 列表排序.具体就是操作的列表,将无序列表变成有序列表! 一.排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. 排序的稳定性: 经过某种排序后,如果两个记录序号同等,且两者在原无序记录中的先后秩序依然保持不变,则称所使用的排序方法是稳定的,反之是不稳定