2008-11-05 6 views
3

는 약 50 C++에서 플랫 텍스트 파일 생성 - IO 100메가바이트 이전 스타일 파일을 사용하여 400 만 번C++에서 큰 파일을 만드는 가장 빠른 방법은 무엇입니까?

+0

나는 그것이 모두 당신이 파일에서 원하는 "텍스트"와 정확히 "최고의"것에 달렸다고 생각한다. 가장 빠름? 반복적으로 몇 가지 샘플 텍스트가 들어있는 버퍼를 작성하면 가장 빠른 속도로 얻을 수 있습니다. 최상의 속도를 얻기 위해 버퍼의 크기를 선택하는 것은 실험을 필요로합니다. –

+1

'라크'는 인도 단어로 10,000입니다. – ijw

답변

15

의 파일에 삽입 할 '첫 번째 줄에 추가'내용에 을

하면 fopen 기입하는 파일

원하는 파일 크기 fseek과 - 1.

에 fwrite 단일 바이트

FCLOSE 파일

+0

1) "추가 된 첫 줄"을 잊어 버렸습니다. 2) 모든 OS/파일 시스템에 물리적으로 할당하지 않았습니다. 일부는 중간 블록을 할당되지 않은 채로 둡니다. raj는 디스크 공간이 실제로 물리적으로 할당되어야하는지 아니면 논리적으로 만 사용해야 하는지를 말해야합니다. – blabla999

+0

무엇을 40 lakhs 시간 뜻입니까? – EvilTeach

+0

Lol. 이것은 원래 질문을 해결합니다. 그 이후로 약간 편집되었습니다. 새로운 대답이 필요합니다. – EvilTeach

10

특정 크기의 파일을 생성하는 가장 빠른 방법 creat() 또는 open()을 사용하여 길이가 0 인 파일을 만든 다음 chsize()를 사용하여 크기를 변경하십시오. 이것은 단순히 디스크에 파일을위한 블록을 할당 할 것이고, 그 내용은 그 블록 (들)에 있었던 모든 것이 될 것입니다. 버퍼 쓰기가 필요 없기 때문에 매우 빠릅니다.

+0

좋은 운영 체제는 보안 조치로 할당 된 블록을 모두 제로화해야합니다. 나는 Novell Netware가 1989 년에 그 일을 수행했음을 지적 했으므로 이제는 모두해야한다. –

+0

은 O/S에 따라 다릅니다. 대부분의 유닉스 시스템에서 오프셋을 찾고 데이터를 쓰면 중간 블록이 디스크 공간을 차지하지 않는 "스파 스 파일"로 끝납니다. – Alnitak

+0

실제로 할당되고 채워지지 않은 블록이 0으로 채워져 있지 않다는 사실도 여기에 없으며 거기에 없습니다. 스파 스 파일 (Unix에서는 최소한)은 찾고있는 보안 인 0으로 읽혀집니다. – ijw

2

확실하지 않은 질문입니다. 파일의 모든 문자가 인쇄 가능한 ASCII 문자인지 확인 하시겠습니까? 그렇다면 이건 어때? 당신은 OS를 언급하지 않은하지만 난 CREAT/열림/닫힘/쓰기가 가능합니다 가정합니다

#include <stdio.h> 
int main() 
{ 
    const int FILE_SiZE = 50000; //size in KB 
    const int BUFFER_SIZE = 1024; 
    char buffer [BUFFER_SIZE + 1]; 
    int i; 
    for(i = 0; i < BUFFER_SIZE; i++) 
     buffer[i] = (char)(i%8 + 'a'); 
    buffer[BUFFER_SIZE] = '\0'; 

    FILE *pFile = fopen ("somefile.txt", "w"); 
    for (i = 0; i < FILE_SIZE; i++) 
    fprintf(pFile, buffer); 

    fclose(pFile); 

    return 0; 
} 
1

"... abcdefghabc"으로 파일을 채 웁니다.

정말 효율적으로 쓰기와 말, 가정, 4k의 페이지와 디스크 블록의 크기와 반복되는 문자열을

:

  1. 파일을 엽니 다.
  2. 반복되는 문자열에 4k * 개의 문자를 할당하십시오. 페이지 경계에 맞춰 정렬하는 것이 이상적입니다.
  3. 반복 된 문자열을 메모리에 4k 번 인쇄하여 블록을 정확하게 채 웁니다.
  4. 블록을 디스크에 필요한만큼 여러 번 쓰려면 write()를 사용하십시오. 크기가 제대로 나올 수 있도록 마지막 블록에 부분 조각을 쓸 수도 있습니다.
  5. 파일을 닫습니다.

이것은 fopen() 및 친구들의 버퍼링을 우회합니다 버퍼로 작업하는 오버 헤드.

이 코드는 C++이나 C로 쉽게 작성할 수 있지만 효율성을 위해 iostream이나 stdio 대신 POSIX 호출을 사용한다고 가정하므로 코어 라이브러리 사양 밖에 있습니다.

+0

나는이 대답을 정말 좋아하지만, 나는 바보 같은 C freshie이다. 그리고 이것은 멍청한 질문처럼 느껴진다. 그러나 어떻게 페이지 경계에 맞추는가?. –

0

가장 빠른 방법은 C++로 큰 파일을 만드시겠습니까? 확인. 가장 빠른 방법은 가장 작은 실행 시간을 갖는 방법을 의미합니다.

'추가 된 첫 줄'내용이 약 50-100MB 인 플랫 텍스트 파일을 4 백만 번 파일에 삽입해야합니다.

내 추측이다

fopen the file for write. 
fseek to the the string length * 4000 
fwrite a single byte 
fclose the file 

open the file for read/write 
loop 4000 times, 
    writing the string to the file. 
close the file. 

IO 이전 스타일 파일을 사용하여 파일을 미리 할당

fopen the file for write. 
fseek to the desired file size - 1. 
fwrite a single byte 
fclose the file 

create a string containing the "Added first line\n" a thousand times. 
find it's length. 

IO 이전 스타일 파일을 사용하여 파일을 미리 할당. 나는 그것을 할 수있는 많은 방법이있을 것이라고 확신한다.

관련 문제