数据库系统实现-两阶段多路归并排序算法的C实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
两阶段多路归并排序
Two-Phase Multiway Merge-Sort
实验报告
目录
1 实验目的 (3)
2 实验内容 (3)
3 实验环境 (3)
4 实验的设计和实现 (3)
4.1 算法描述 (3)
4.2 设计思路 (4)
4.3 数据结构 (5)
4.4 具体实现 (6)
5 实验结果 (9)
5.1 50MB内存TPMMS实验结果 (9)
5.2 10MB内存TPMMS实验结果 (9)
5.3 100MB内存TPMMS实验结果 (10)
5.4 三者的比较 (11)
6 实验遇到的问题和解决方法 (11)
6.1 Phase2阶段遇到的问题和解决方法 (11)
6.2 生成子记录文件名的方法 (13)
7 代码附录 (13)
1实验目的
通过merge-sort算法的实现,掌握外存算法所基于的I/O模型与内存算法基于的RAM模型的区别;理解不同的磁盘访问优化方法是如何提高数据访问性能的。
2实验内容
生成一个具有10,000,000个记录的文本文件,其中每个记录由100个字节组成。实验只考虑记录的一个属性A,假定A为整数类型。记录在block上封装时,采用non-spanned方式,即块上小于一个记录的空间不使用。Block的大小可在自己的操作系统上查看,xp一般为4096 bytes。在内存分配50M字节的空间用于外部merge-sort。要求设计和实现程序完成下列功能:
1)生成文本文件,其中属性A的值随机产生。
2)按照ppt中的方法对文本文件中的记录,按照属性A进行排序,其中在
第二阶段的排序中每个子列表使用一个block大小的缓冲区缓冲数据。
3)按照教材cylinder-based buffers(1M bytes)的方法,修改第二阶段的算法。
4)比较两种方法的时间性能,如果有更大的内存空间,算法性能还能提高
多少?
3实验环境
1)Visual C++ 6.0
2)Windows 7操作系统
4实验的设计和实现
4.1算法描述
Two-Phase Multiway Merge-Sort算法的具体描述分为2个阶段,如下所示:
●Phase 1
1)Fill main memory with records.
2)Sort with favorite main memory sorting algorithms.
3)Write sorted list to disk.
4)Repeat until all records have been put into one of the sorted lists.
●Phase 2
1)Initially load input buffers with the first block of their respective sorted
lists.
2)Repeated run a competition among the first unchosen records of each of
the buffered blocks.
3)If an input block is exhausted, get the next block from the same file.
4)If the output block is full, write it to disk.
4.2设计思路
从上述的算法描述中,我们知道,系统主要由2大模块组成:Phase1和Phase2。Phase1阶段主要将生成的记录文件按内存块大小(本实验中是50MB)分成多个(本实验中是20个)相应的子记录文件,把这些文件中的记录读进内存进行排序,再写回磁盘上。Phase2阶段利用多路归并排序算法,将Phase1阶段已经排好序的子记录文件重新归并为1个有序的记录文件,写回到磁盘上。由于我们在Phase1和Phase2阶段之前必须先生成1个含有10000000个100B记录的文件,所以系统必须再加上1个生成记录文件的Generate Record File模块。终上所述,系统由3大模块组成,分别为:Generate Record File、Phase1、Phase2。Phase1模块可以细分为内存块排序模块Main Memory Sort和写回磁盘模块Write To Disk。Phase2模块可以细分为多路归并排序模块Merge-Sort和写回磁盘模块Write To Disk。
详细的系统逻辑结构图如图3-1所示:
图3-1 TPMMS系统逻辑结构图
4.3数据结构
我们讨论单个记录的数据结构。由于1个记录有100个字节,其中4字节是由随机整数组成的主键属性Primary Key,另外96个字节是随意填充的数据content,而且本系统又是由C语言进行实现的,所以我们可以采取结构体来作为记录的数据结构。其中整形字段key记录4字节的主键属性,以便进行排序工作。数组字段contents用来填充剩余的96个字节,内容可以随意(本实验中均为0)。具体的数据结构如图4-1所示:
图4-1 单个记录的数据结构
4.4具体实现
4.4.1Generate Record File阶段
Generate Record File阶段比较简单,首先打开一个文件,然后生成随机数key并将其写入文件中,再填充96个任意内容的字节(本实验中均为0),即能生成1条完整的记录。重复10000000次,生成我们所需的记录文件。核心代码实现如图4-2所示,其中MAX_RECORD_NUMBER大小为10000000,ROW_NUMBER大小为95。
图4-2 Generate Record File阶段的实现
4.4.2Phase1阶段
Phase1阶段重点在于如何进行内存排序,并写回到磁盘上。这里我们采用了STL的sort函数帮助我们进行排序。首先读入50MB记录,利用sort 函数进行排序后,写到磁盘上生成1个有序的子记录文件。重复进行20次,生成20个相应的子记录文件。核心代码实现如图4-3所示,其中BLOCK_SIZE大小为50M,SUB_LIST_NUMBER大小为20。