我将两个大(每个近 8 GB)文件合并为一个。我尽量优化它。
void merge() {
char *array[17]= {"q.out","b.out"}; // names of input files
FILE *finpt1 = fopen(array[0],"r"), *finpt2 = fopen (array[1],"r"),
*foutp = fopen("final_.out","w");
u_int32_t a,b;
fscanf(finpt1, "%u", &a);
fscanf(finpt2, "%u", &b);
int EOF1_my = 0, EOF2_my = 0;
while (true) {
if ( a>b ) {
fprintf( foutp,"%u\n", b);
if ( fscanf(finpt2, "%u", &b) == EOF) { EOF2_my = EOF; break; }
} else {
fprintf( foutp,"%u\n", a);
if ( fscanf(finpt1, "%u", &a) == EOF) { EOF1_my = EOF; break; }
}
}
if ( EOF1_my == EOF) {
while ( fscanf(finpt2, "%u", &a) != EOF)
fprintf(foutp, "%u\n", a);
} else if ( EOF2_my == EOF) {
while (fscanf(finpt1, "%u", &b) != EOF)
fprintf( foutp,"%u\n", b);
}
fclose(finpt1); fclose(finpt2); fclose(foutp);
}
我怀疑多次调用 printf 会消耗大量资源(我注意到我的带有日志记录的程序通常比没有记录的程序运行速度要慢得多)。而且我认为它大部分时间都花在格式化字符串上(不写入文件,因为使用了缓冲)。
所以我想知道是否最好在内存中形成字符串以由我自己输出并写入,例如10000个符号到一个文件中以吸引fprintf函数 - 比如fprintf(“%s”,字符串);?
我对 fscanf 也有同样的疑问。也许我应该使用其他一些功能?
欢迎任何想法。提前致谢!
修复错误
感谢 sfstewman(在对问题的评论中注意到)。很酷,这是非常有价值的信息,直到我开始编写测试(或者可能永远不会)之前我不会注意到这些信息。
谢谢你的代码,但无论如何给我准备好的代码你让我没有乐趣。
这是我的蛋糕!
想法更有价值,现在我知道字典比较的目的是什么)