M.S. Student at Korea Univ.
TODAY 8 TOTAL 21,723
How to Read Big File in C++ (대용량 파일 읽기)

How to Read Big File in C++

C++ 대용량 파일 읽기


레퍼런스를 찾으면 보통 다음과 같이 코드를 작성할 것을 권한다.


void fileread(const char* _path){
    pFile = fopen(_path, "rb");

    //read size of file
    fseek(pFile, 0, SEEK_END);
    long lSize = ftell(pFile);
    fseek(pFile, 0, SEE`K_SET);

    char *buff = (char*)malloc(sizeof(char)*lSize);

    unsigned int result;

    //read all
    result = fread(&buff[totnum],sizeof(char),lSize,pFile);
    if (result != lSize) {
        cout << "not read all file" << endl;
    }

//처리

free(buff)
}


 그러나 이번에 진행했던 프로젝트는 검색 엔진을 만드는 것인데 55만 개의 문서를 인덱싱한 파일의 크기는 2.4GB였다. 이렇게 파일 용량이 큰 경우 fread로 한 번에 읽는 것은 불가능하다. fread는 얼만큼 읽었는지 return하므로 read가 끊긴 부분부터 다시 읽기 시작하면 다음과 같이 대용량 파일을 한 번에 읽을 수 있다.


void fileread(const char* _path){
    pFile = fopen(_path, "rb");

    //read size of file
    fseek(pFile, 0, SEEK_END);
    long lSize = ftell(pFile);
    fseek(pFile, 0, SEE`K_SET);

    char *buff = (char*)malloc(sizeof(char)*lSize);

    unsigned int totnum = 0;
    unsigned int curnum = 0;

    //read all big file
    while ((curnum = fread(&buff[totnum], sizeof(char), lSize - totnum, pFile)) > 0) {
        totnum += curnum;
    }

    if (totnum != lSize) {
        cout << "not read all file" << endl;
    }
}


그렇다면 왜 파일을 한 번에 읽어야 할까?
이유는 간단한데, 파일 입출력을 하는 것은 매우 느려서 한 글자씩, 한 줄씩 읽도록 프로그램을 짤 경우 비효율적인 프로그램을 만들게 되기 때문이다.


2  Comments,   0  Trackbacks
  • 첫 소스의 // read all 다음 줄 코드는
    result = fread(&buff[lSize], sizeof(char), lSize, pFile);
    모양으로 되어야 하는 것 아닌가요?
    둘째 소스는 잘 모르겠지만, 같은 줄 마지막 매개변수가 빠진 것 같은데 ...
    • 김병희님 안녕하세요!
      말씀해주신 것처럼 fread의 인자로 File Pointer를 받는 것이 맞습니다^^ 제가 블로그로 작성하며 코드를 옮겨 적는 과정에서 빼먹은 것 같네요.. 감사합니다 수정하였습니다 :)
댓글 쓰기

티스토리 툴바