두 개의 큰 파일 (8GB 근처)을 하나로 합칩니다. 나는 그것만이 가능한만큼 그것을 최적화하려고 노력한다.C fprintf/fscanf 큰 파일의 속도 최적화
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와 여러 번 호출하면 상당한 자원을 소비하는 의심 (I 로깅 내 프로그램은 원칙적으로하지 않고보다 더 크게 느리게 작동하는 것으로 나타났습니다). 그리고 나는 대부분의 시간이 포맷팅 문자열 (버퍼링이 사용되기 때문에 파일에 쓰지 않음)을 사용한다고 생각합니다.
그래서 나 자신이 메모리에 출력하고 문자열을 작성하는 것이 더 나은지 궁금합니다. fprintf ("% s", string);와 같이 fprintf 함수에 호소하기 위해 파일에 10000 개의 기호를 추가합니다.
나는 fscanf에 관해 동일한 의구심을 가지고 있습니다. 아마도 다른 기능을 사용해야할까요?
모든 의견을 환영합니다. 미리 감사드립니다.
고정 BUG sfstewman에
감사합니다 (질문에 대한 의견주의). 멋지다. 테스트를 시작하지 않거나 결코 가능하지 않을 때까지 내가 알지 못하는 정말 귀중한 정보이다.
코드를 보내 주셔서 감사합니다. 그러나 어쨌든 나에게 재미있는 일없이 나를 남겨 둘 준비가되어있는 코드를 제공합니다.
그건 내 케이크 조각이야!
아이디어는 훨씬 더 가치가 있습니다. 이제는 사전 비교가 무엇인지 알고 있습니다.
버퍼링 작업을 직접하고 싶지 않으면'stdio.h '('man setbuffer')의 표준 버퍼를 확대하면됩니다. –
디스크 입출력은 항상 fprintf()/fscanf()보다 비용이 많이 듭니다.CPU 부하를 확인, 아마'될 것 <10 %' – wildplasser
'fprintf' 버퍼링이며, 출력은 당신이 무슨 일을하는지에 대한 중요한 작업입니다, 그래서 당신이 해지고, 출력 비용을 줄일 수 있다는 것을 의심한다. 전환 비용을 줄일 수 있습니다. 파일의 구조는 무엇입니까? 각 번호는 별도의 줄에 있으며 숫자는 여러 공백 형식으로 구분됩니까? – sfstewman