已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据库系统实现实验报告一、实验名称:TwoPhase,MultiwayMerge-Sort二、实验环境:Linux操作系统 标准c89、c99都可运行三、实验目的:通过merge-sort算法的实现,掌握外存算法所基于的I/O模型与内存算法基于的RAM模型的区别;理解不同的磁盘访问优化方法是如何提高数据访问性能的。四、实验内容:生成一个具有10,000,000个记录的文本文件,其中每个记录由100个字节组成。实验只考虑记录的一个属性A,假定A为整数类型。记录在block上封装时,采用non-spanned方式,即块上小于一个记录的空间不使用。Block的大小可在自己的操作系统上查看,xp一般为4096bytes。在内存分配50M字节的空间用于外部merge-sort。要求设计和实现程序完成下列功能:1生成文本文件,其中属性A的值随机产生。2按照ppt中的方法对文本文件中的记录,按照属性A进行排序,其中在第二阶段的排序中每个子列表使用一个block大小的缓冲区缓冲数据。3按照教材cylinder-basedbuffers(825280bytes)的方法,修改第二阶段的算法。4比较两种方法的时间性能,如果有更大的内存空间,算法性能还能提高多少?五、实验分析:一个具有10,000,000个记录的文本文件共计10,000,000*100B=1000MB,而内存只有50MB,50MB/4KB=50*1024KB/4KB=12800块,每块可以存放4*1024B/100B=40个记录,每块剩余96KB,内存一共可以存放12800*40=512000个记录,一共有10,000,000个记录。所以要进行10,000,000/512000=19.53次,即20次排序,每次排序的记录数为10,000,000/20=500,000个记录。因此此次实验需要将文本文件分成20个子文件。分别对子文件分别进行内部排序。最后对20个排好序的子文件进行归并排序,完成排序。六、实验步骤:1.生成一个具有10,000,000个记录的文本文件f0.txt,其中每个记录由100个字节组成,其中有一个整数类型属性A。程序生成一个int型随机整数作为每条记录的属性A。记录写入f0.txt文件中。2.根据实验分析,将f0.txt文件分为20个子文件,并且按照文件中每个记录的属性对各个子文件进行内部排序(使用快速排序加快时间),最终形成20个有序的子文件3.对20个有序的子文件进行归并排序(在比较20个数大小的时候使用堆排序算法),最终形成一个有序的结果文件f0.txt,同时删除20个中间生成的小文件。七、实验流程图:Step2:开始(nr=read(f0,tr,LS)0 N Y关闭文件f0快速排序结束创建新文件fi写入新文件拍好的数据关闭文件Step3:开始i0 N Ytrti=fi1.tffi1.lesk;ti+;结束ti=Lwrite(fg,tr,LS); ti=0;fi1.lesk=fi1.nr Yfi1.nr=(read(fi1.flg,fi1.tf,SB)/S;装入内存是否成功功 N Y关闭文件fi; dr- -文件fi偏移量置零进行堆排序下调算法八、实验截图及分析:1. 在第二阶段的排序中每个子列表使用一个block大小的缓冲区缓冲数据总体运行结果图图 1生成20个小文件的图图 2第19个小文件的结果图 3文件f0.txt在排序前后的结果(看其中的修改时间)图4 图 52.结果分析从图上可以看出第一阶段生成一个10000000个记录的文件在13秒左右,第二阶段生成20个小文件并排序在37秒左右,但是其算法复杂度为o(nlog2n20)o(n)(n=512000比较小所以可以)在考虑到cup的运算速度和第一阶段生成随即数花费的时间,第二阶段的时间应该和第一阶段的时间差不多。第三阶段的时间为80秒左右,但是其算法复杂度按理来说是是三个阶段中最少的,平均次数为12log220n3n(n=1000000000)但是它的io次数太多为250020次,即增加了程序中断开销,又增加了磁盘读取和写入的开销。第二阶段的解决办法,减少递归的次数在数据量小于16时用插入排序。第三阶段用题目要求的cylinder-basedbuffers(8255280bytes)的方法3.改进后的结果(cylinder-basedbuffers(825280bytes)的方法)考虑到一个记录100个字节所以去每个子列表的缓冲区为825200bytes图6图7九、实验总结改进后的算法明显要好于第一次运行的结果。第三阶段表现最明显,Io次数减少后时间减少了60秒。如果每个子列表的缓冲区为cylinder的整数倍或略小于他的整数倍的话效果都会非常的好,如果有更大的内存空间它将与第二阶段的时间一样甚至还要少。十、实验代码/* = Name : dbt.c Author : sunbo Version : Copyright : Your copyright notice Description : Hello World in C, Ansi-style = */#include#include#include#include#include#include #include #include #define R 10000000/总记录数#define L 512000/内存最大记录数#define S 100/单个记录的长度#define D 20/R/L+1#define A 0/记录中属性A的位置#define B 82252/一个子文件的内存中的记录数#define SB 8225200/S*B#define LS 51200000/L*S/表示一个记录 struct btr int record25; ; /表示子文件的路径struct pstr char ptD30; ; int main() time_t startT,sdT,sfT, endT; clock_t a,b,c,d; int step1(const char*, struct btr *);/生成一个10,000,000个随机记录的文件 struct pstr step2(const char*, struct btr *);/将上面的文件分成20个小文件并排序 void step3(struct pstr,struct btr *);/用归并算法将上面的20个小文件排好续重新放入源文件 startT=time(NULL); a=clock(); char * str=f0.txt;/原始文件的目录 struct btr *tr; tr = (struct btr *)malloc(LS); step1(str,tr); sdT=time(NULL); b=clock();printf(第一阶段的运行时间为%fn,difftime( sdT, startT); printf(%fn,(double)(b-a)/1000); struct pstr ps= step2(str,tr); sfT=time(NULL); c=clock(); printf(第二阶段的运行时间为%fn,difftime( sfT, sdT); printf(%fn,(double)(c-b)/1000); step3(ps,tr); endT=time(NULL); d=clock(); printf(%fn,(double)(d-c)/1000); printf(第三阶段的运行时间为%fn,difftime( endT, sfT); printf(总运行时间为%fn,difftime( endT, startT); free(tr); return 0; int step1(const char*str,struct btr *tr) int f0; srand(unsigned)time(NULL); f0 = open(str,O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR); int i=0,j=0,m=L; while(jD) i=0; while(irecordA=rand();/printf(%dn,(tr+i)-recordA); i+; write(f0,tr,i*sizeof(struct btr); j+; if(j=(D-1) m= R-(D-1)*L; close(f0); return 0; /将上面的文件分成20个小文件并排序 struct pstr step2(const char*str, struct btr *tr) /快速排序 void kuip(struct btr *,int,int); /int cmp(struct btr* a, struct btr* b) / return (a-recordA-b-recordA); / struct pstr nps; int f0 = open(str,O_RDONLY); int nr,h=0; while(nr=read(f0,tr,LS)0) /qsort(tr,L,S,cmp); kuip(tr,0,nr/S-1); sprintf(nps.pth,%s%d,file,h); / printf(%sn,nps.pth); int fi=open(nps.pth,O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR); write(fi,tr,nr); close(fi); h+; close(f0); return nps; /快速排序 void kuip(struct btr* tr,int low1,int high1) if(high1-low115) int l1=trlow1.recordA-trhigh1.recordA; int l2=trlow1.recordA-tr(low1+high1)/2.recordA; struct btr prvotkey; if(l10&l20) if(l1l2) prvotkey =tr(low1+high1)/2; else prvotkey=trhigh1; else if(l10&l2l1) prvotkey =tr(low1+high1)/2; else prvotkey=trhigh1; else prvotkey=trlow1; int low=low1; int high=high1; while (lowhigh) while (low=prvotkey.recordA) -high; trlow=trhigh; while (lowhigh&trlow.recordA=prvotkey.recordA) +low; trhigh=trlow; trlow=prvotkey; kuip(tr,low1,low-1); kuip(tr,low+1,high1); else struct btr sor; int i=low1+1; while(i=low1&(sor.recordAtrj.recordA) trj+1=trj; j-; trj+1=sor; i+; /用归并算法将上面的20个小文件排好续重新放入源文件 void step3(struct pstr ps,struct btr * tr) struct fil struct btr *tf; int flg; int lesk; int nr; fiD+1; int i=1; /printf(%dn,1); while(i0&fidt.tf0.recordA1; i+; /printf(%dn,fi1.tf0.recordA); int dr=D,ti=0; int fg= open(f1.txt,O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR); while(dr0) trti=fi1.tffi1.lesk; /printf(%dn,fi1.tf0.recordA); ti+; if(ti=L) /*int j=0; while(jrecordA); j+; */ write(fg,tr,LS); ti=0; fi1.lesk+; if(fi1.lesk=fi1.nr) fi1.nr=(read(fi1.flg,fi1.tf,SB)/S; if(fi1.nr=0) free(fi1.tf); close(fi1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026恒丰银行枣庄分行社会招聘2人考试参考题库及答案解析
- 2026年甘肃省平凉市庄浪县第一批城镇公益性岗位工作人员招聘47人考试参考题库及答案解析
- 2026广东深圳大学土木与交通工程学院周英武特聘教授团队招聘研究助理1人考试参考题库及答案解析
- 2026内蒙古农商银行社会招聘70人笔试模拟试题及答案解析
- 2026广西姆洛甲文化旅游投资有限公司招聘文旅策划主管2人考试参考题库及答案解析
- 2026年宁德市蕉城园投港务有限公司招聘考试备考题库及答案解析
- 2026年大理州弥渡县政务服务管理局招聘公益性岗位人员(1人)考试参考试题及答案解析
- 2026广东惠州市惠阳区城市建设投资集团有限公司第一批次招聘25人考试备考题库及答案解析
- 2025年宁波象山县卫生健康系统公开招聘编外人员36人考试参考试题及答案解析
- 2026广西梧州市万秀区残疾人联合会招聘社区残协专职委员3人考试参考题库及答案解析
- 生鲜乳安全生产培训资料课件
- 2025年国资委主任年终述职报告
- 2026年八年级生物上册期末考试试卷及答案
- 工程顾问协议书
- 2026年沃尔玛财务分析师岗位面试题库含答案
- 大学教学督导与课堂质量监控工作心得体会(3篇)
- 广东省汕头市金平区2024-2025学年九年级上学期期末化学试卷(含答案)
- 项目专家评审意见书标准模板
- 2025年高中计算机操作试题题库及答案
- 江苏省G4(南师大附中、天一、海安、海门)联考2026届高三年级12月份测试(G4联考)生物试卷(含答案)
- 2026年山西信息职业技术学院单招职业技能测试题库及参考答案详解1套
评论
0/150
提交评论