我正在尝试在一个非常大的数据集上实现一个 i/o 密集型快速排序(C++ qsort)。为了速度,我想一次将一大块数据读入缓冲区,然后使用 qsort 在缓冲区内对其进行排序。(我目前正在处理文本文件,但想尽快转向二进制文件。)但是,我的数据由可变长度记录组成,并且需要告诉 qsort 记录的长度才能进行排序。有什么办法可以标准化吗?我唯一能想到的是相当复杂:我的程序当前从缓冲区读取,直到它遇到换行符(ascii 中的“10”),将每个字符转移到另一个数组。当它找到换行符(输入文件中的分隔符)时,它用空字符填充该记录的缓冲区中剩余的空间数(记录大小设置为 30)。这样,我应该得到一个充满固定大小记录的缓冲区来提供 qsort。
我知道我的方法有几个问题,一个是它很笨拙,另一个是记录大小可能会大于 30,但通常要小得多。有没有更好的方法来做到这一点?
同样,我当前的代码甚至不起作用。当我调试它时,它似乎正在将字符从一个缓冲区传输到另一个缓冲区,但是当我尝试打印出缓冲区时,它只包含第一条记录。
这是我的代码:
FILE *fp;
unsigned char *buff;
unsigned char *realbuff;
FILE *inputFiles[NUM_INPUT_FILES];
buff = (unsigned char *) malloc(2048);
realbuff = (unsigned char *) malloc(NUM_RECORDS * RECORD_SIZE);
fp = fopen("postings0.txt", "r");
if(fp)
{
fread(buff, 1, 2048, fp);
/*for(int i=0; i <30; i++)
cout << buff[i] <<endl;*/
int y=0;
int recordcounter = 0;
//cout << buff;
for(int i=0;i <100; i++)
{
if(buff[i] != char(10))
{
realbuff[y] = buff[i];
y++;
recordcounter++;
}
else
{
if(recordcounter < RECORD_SIZE)
for(int j=recordcounter; j < RECORD_SIZE;j++)
{
realbuff[y] = char(0);
y++;
}
recordcounter = 0;
}
}
cout << realbuff <<endl;
cout << buff;
}
else
cout << "sorry";
非常感谢,bsg