(转)外部排序

  转自:http://www.2cto.com/kf/201307/225189.html

  内排序算法我们学了很多,快速排序、冒泡排序等。这些排序的前提是数据量不大,能够全部读进内存里。外排序是指对大数据量进行排序,数据量大到不能全部读进内存里,必须在内存和外存间换进换出进行排序。

    最常用的外排序法是归并法。举个例子,对900M的数据进行外排序,但内存只有100M。排序过程:

1、将原数据分组进行排序,每组100M,一共9组。 排序过程是读100M进内存,对这100M进行内排序(用快速排序等),然后输出到外存的一个临时文件。接下来读下一个100M。

2、步骤1产生了9个排好序的临时文件。将100M内存分为10个10M的buffer,其中9个作为9个输入文件的buffer,另外一个10M内存作为输出buffer,然后做9路归并排序。

 

     回想一下以前学的内排序中的归并排序,与归并法外排序做比较。 发现他们差别是:

1、内排序中的归并排序是两个两个做归并组成一个大的有序数组然后接着和大数组进行归并。

2、外排序中的归并排序做9路归并,一次性归并完。

    这种做法的好处是减少对硬盘的读写次数。多路归并时对每一个数据只进行一次硬盘读写,若是像内排序中的归并那样直要有多次的读写硬盘。  谨记,现代计算机中的程序,瓶颈基本上是在IO,而不在于CPU。

 

    事实上,这里有一个问题需要权衡。太多路同时进行归并也会有问题。我们的例子中,输入buffer每次可以读取10M的数据。但如果数据真的特别大,以至于多路归并时内存分了太多个buffer,导致每个buffer很小每次只能读入很小的数据比如说1K,这种情况性能也会大大降低的。这时候就需要做多次的归并,比如说对于1个100G的输入数据,可以一个G一个G的做归并外排序然后存到外存临时文件里,然后再对这10个G做一个10路归并。

  当对数据记录量巨大的数据文件进行排序时,由于受到内存容量的限制,无法将所有数据记录一次全部读入到内存进行。排序过程中需要多次进行内、外存之间的数据交换。利用外存对数据文件进行排序称为外部排序。
       外部排序最基本的方法是归并。这种方法是由两个相对独立的阶段组成:
① 按内存(缓冲区)的大小,将n个记录的数据文件分成若干个长度为l的段或子文件,依次读入内存并选择有效的内部排序方法进行排序;然后将排好序的有序子文件重新写入到外存。子文件称为归并段或顺串。
② 采用归并的办法对归并段进行逐趟归并,使归并段的长度逐渐增大,直到最后合并成只有一个归并段的文件—排好序的文件。
      
1 外部排序的简单方法
    归并排序有多种方法,最简单的就是2-路归并。
    设有一个磁盘上的数据文件,共有100,000个记录(A1, A2,…,A100000),页块长为200个记录,供排序使用的缓冲区可提供容纳1000个记录的空间,现要对该文件进行排序,排序过程可按如下步骤进行:
        第一步:每次将5个页块(1000个记录)由外存读到内存,进行内排序,整个文件共得到10个初始顺串R1~R10 (每一个顺串占5个页块),然后把它们写回到磁盘上去。
       第二步:然后两两归并,直到成为一个有序文件为止。

     
由图可知,每趟归并由m个归并段得到┌m/2┐个归并段。
2 外排序的时间分析
         外排序的时间消耗比内排序大得多,原因是:
●  外排序的数据量(记录)一般很大;
●  外排序涉及到内、外存之间的数据交换操作;
●  外存的操作速度远远比内存中的操作慢。
外排序的总时间由三部分组成:
外排序的时间=产生初始归并段的时间(内排序)m×tis
                          +I/O操作的时间d×tio
                          +内部归并的时间s×utmg
其中:
m:初始归并段数目;tis:得到一个归并段的内排序时间;
d:总的读、写次数;tio:一次读、写的时间;
s:归并的趟数;utmg:对u个记录进行一趟内部归并排序的时间。
        一般地,tio>>tis,tio>>tmg,tio而取决于所用外存,因此,影响外排序效率的主要原因是内、外存之间数据交换(读、写外存)。提高效率的主要方法(途径)有:
●  进行多路归并,减少文件归并的趟数;
●  增加归并段的长度,减少初始归并的数目;
●  根据不同归并段的长度,采取最佳归并方案。

时间: 2024-10-08 03:44:47

(转)外部排序的相关文章

排序之外部排序

有时,待排序的文件很大,计算机内存不能容纳整个文件,这时候对文件就不能使用内部排序了(这里做一下说明,其实所有的排序都是在内存中做的,这里说的内部排序是指待排序的内容在内存中就可以完成,而外部排序是指待排序的内容不能在内存中一下子完成,它需要做内外存的内容交换),外部排序常采用的排序方法也是归并排序,这种归并方法由两个不同的阶段组成: 1.采用适当的内部排序方法对输入文件的每个片段进行排序,将排好序的片段(成为归并段)写到外部存储器中(通常由一个可用的磁盘作为临时缓冲区),这样临时缓冲区中的每个

外部排序&多路归并排序

外部排序: 一.定义问题 外部排序指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序 整个文件的目的.外部排序最常用的算法是多路归并排序,即将原文件分解成多个能够一次性装入内存的部分,分别把每一部分调入内存完成排序.然后,对已经排 序的子文件进行多路归并排序. 二.处理过程 (1)按可用内存的大小,把外存上含有n个记录的文件分成若干个长度为L的子文件,把这些子文件依次读入内存,并利用有效的内部排序方法对它们进行

19. 蛤蟆的数据结构进阶十九外部排序相关概念

19. 蛤蟆的数据结构进阶十九外部排序相关概念 本篇名言:"一个人最怕不老实,青年人最可贵的是老实作风. "老实 " 就是不自欺欺人,做到不欺骗人家容易,不欺骗自己最难. "老实作风 " 就是脚踏实地,不占便宜.世界上没有便宜的事,谁想占便宜水就会吃亏. --徐特立" 之前我们学习的排序都是内部排序的,接下去来看下外部排序. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47

外部排序总结

如果数据量过大,超过最大的内存容量,那么一次性将所有数据读入内存进行排序是不可行的. 例如,一个文件每一行存了一个整数,该文件大小为10GB,而内存大小只有512M,如何对这10GB的数据进行排序呢? 外部排序就是为了解决这种问题的. 思路: 外部排序的思路是,将超大文件分成若干部分,每一部分是可以读入内存的,例如,将10GB的文件分为40份,则每一份就只有256M.将每一份读入内存,用已知的方法进行排序(快拍,堆排等方式),再写到一个文件中.这样,我们得到了40个已序的小文件. 再采用归并(M

内部和外部排序排序

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

外部排序

部排序指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的. 我们一般提到排序都是指内排序,比如快速排序,堆排序,归并排序等,所谓内排序就是可以在内存中完成的排序.RAM的访问速度大约是磁盘的25万倍,我们当然希望如果可以的话都是内排来完成.但对于大数据集来说,内存是远远不够的,这时候就涉及到外排序的知识了. http://zhidao.baidu.com/link?url=lUbNMEhPBlNk

sphinx 源码阅读之分词,压缩索引,倒排——单词对应的文档ID列表本质和lucene无异 也是外部排序再压缩 解压的时候需要全部扫描doc_ids列表偏移量相加获得最终的文档ID

转自:http://github.tiankonguse.com/blog/2014/12/03/sphinx-token-inverted-sort.html 外部排序 现在我们的背景是有16个已经排序的数据存在磁盘上.由于数据量很大,我们不能一次性全部读进来. 我们的目标是依次挑出最小的hit,然后交给索引引擎处理. sphinx 使用了 CSphHitQueue 这个数据结构. CSphHitQueue 你猜是什么? 队列? 恭喜你,猜错了.CSphHitQueue 是一个最小堆.且堆的最

外部排序,杀鸡焉用牛刀?

上篇:http://blog.csdn.net/gsky1986/article/details/46499529 字符集和编码 字节序 I/O方式 内存 磁盘 线程/同步/异步 数据特点 字符集和编码 为什么要考虑文件的编码? 当你将文件从阿拉伯传到中国,告诉你的中国朋友要进行一个外部排序,你的中国朋友也许会傻: 上面是什么?乱码. 你也可以这样体验乱码: echo "数" > t.txt iconv -f UTF-8 -t UNICODE t.txt ??pe 好了,你知道了

外部排序-第11章-《数据结构题集》习题解析-严蔚敏吴伟民版

习题集解析部分 第11章 外部排序 ——<数据结构题集>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑       相关测试数据下载  链接? 数据包       本习题文档的存放目录:数据结构\▼配套习题解析\▼11 外部排序