F(Total)=Sizeof(DataSet)
F(Sub)=sizeof(File1)+sizeof(File2)+…………………..+sizeof(Filen);
F(Out)=sizeof(OutputFile);
其中:F(Total)=F(Sub)=F(Out);
那么为了知道DataSet的容量,那么可以使用系统调用stat函数来获得文件的容量;之后将数据读取了存储到n个临时文件中,那么这几个文件的容量是一样的。
也就是:sizeof(file1)=sizeof(file2)=…………………………………=sizeof(filen)
先对每个子文件进行排序,进行升序排序。由于内存是1MB,所以每个文件的大小就是1MB;
那么如何获得子文件,可以先用stat系统调用来获得文件的大小,在将文件读出1MB的内容,在内存中进行排序,在将文件存储在filei中,一直到将DataSet文件读取完,并排序后存储在filei文件中,那么要在将filei文件的内容在经过排序后在存储在一个文件中,那么就得从每个文件中进行读取并在读取的内容中进行排序后在追加到outfile中去;
在内部排序中,快速排序是最快的,所以将快速排序运用到对外部排序中,也就是对大文件的排序。
进行步骤是:
1:先打开DataSet文件;
intfd=open(argv[1],O_RDONLY);
2:计算该文件的容量,并决定每次读取多少;
Structstat buf;
fdtat(fd,&buf);
size_tcapcity=buf.st_size;
intnum=capcity/MAX_BUF;
3:对读取的内容进行快速排序;
Intread_len=Read(buf,1024,fd);
Quick_sort(buf);
intret=strcmp("15288179485","15288179482");使用这个函数来进行比较,如果是相等的话,那么函数返回的是0,如果第一个字符串大于第二个,那么返回的是1,否返回的是-1;
4:将文件存储去独立的文件;
Create(filei_name,x0777);
Write(buf,read_len,fd);
5:重复3、4步骤,直到DataSet文件读取完成;
使用num进行循环读取
6:在从所有子文件中读取1MB的容量进入内存;
7:对读取的内容进行快速排序;
8:情况原来的DataSet文件的内容;
9:将内存中进行快速排序好的内容追加到DataSet中去;
9:重复6、7、8、9步骤,直到所有的子文件读取完,并保存好;
10:程序执行完成;程序的实现如下:
/**
*程序的目的是对一种大文件,且内存是有限的情况下的内容进行排序的算法
*在此程序中内存容量是1MB,所以每次只能读取1MB的文件内容到内存中进行
*快速排序,使用快速排序的原因是,因为在内部排序中,快速排序是最快的,
**/
#include<sys/types.h>
#include<sys/stat.h>
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<errno.h>
#include<malloc.h>
#define MAX_BUF 1024
#define MAX_ARRAY 85
void quick_sort(char *buf[],int low,int high);
void save_sort(char *,const char*buf[],size_t);
int main(int argc,const char* argv[]){
if (argc<=1)
{
printf("paramtes error!\n");
return -1;
}
int data_set;
int fd;
fd=open(argv[1],O_RDONLY);
if (fd==-1)
{
perror("open fail!");
return -1;
}
struct stat tat;
int ret=0;
ret=fstat(fd,&tat);
if (ret==-1)
{
perror("stat fail!");
return -1;
}
int capcity=tat.st_size;
int num=capcity/MAX_BUF;
num+=1;
char data[12];
char *buf[MAX_ARRAY];
int i=0;
/**
*将文件中的内容读出
*/
int j=0;
for(j=0; j<num; ++j){
for(i=0; i<MAX_ARRAY; ++i){
memset(data,0,12);
ret=read(fd,data,12);
if (ret<=0)
{
perror("read fail!\n");
break;
}
if(j==0)
buf[i]=(char*)malloc(ret);
memset(buf[i],0,ret);
strcpy(buf[i],data);
buf[i][11]='\0';
printf("data:%s",buf[i]);
}
printf("time buf[0]=%s",buf[0]);
quick_sort(buf,0,i-1);
/**
*下面是自动生成文件名
*/
char filename[11]="sub_file";
filename[8]=(char)((char)(j/num)+48);
filename[9]=(char)((char)(j%num)+48);
filename[10]='\0';
save_sort(filename,buf,i);
}
return 0;
}
/************************************************************************/
/* 下面是对文件中内存中的1MB的内容进行快速排序 */
/************************************************************************/
void quick_sort(char *buf[],int low,int high){
if(low >= high)
return;
int i,j;
i=low;
j=high;
char *key;
key=(char*)malloc(strlen(buf[low]));
memset(key,0,strlen(buf[low]));
strcpy(key,buf[low]);
while(i<j){
while (i<j && (strncmp(buf[j],key,11)>0))
{
j--;
}
if (i<j)
{
memset(buf[i],0,strlen(buf[i]));
strcpy(buf[i],buf[j]);
i++;
}
while (i<j && (strncmp(buf[i],key,11)<0))
{
i++;
}
if (i<j)
{
memset(buf[j],0,strlen(buf[j]));
strcpy(buf[j],buf[i]);
j--;
}
}
memset(buf[i],0,strlen(key));
strcpy(buf[i],key);
quick_sort(buf,low,i-1);
quick_sort(buf,i+1,high);
}
/************************************************************************/
/* 下面是对排好序的内容将其存储在文件中 */
/************************************************************************/
void
save_sort(char filename[],const char* buf[],size_t size){
int fd=open(filename,O_WRONLY | O_CREAT |O_APPEND);
if (-1==fd)
{
printf("save_sort fail!%s\n",strerror(errno));
return;
}
int i=0;
for(i=0; i<size; ++i){
printf("%d ",i);
int ret=write(fd,buf[i],strlen(buf[i]+1));
write(fd,"\n",strlen("\n"));
if (ret<=0)
{
printf("write fail!%d\n",ret);
break;
}
}
printf("save sucess!\n");
close(fd);
}