AI Researcher @NCSOFT
TODAY TOTAL
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;
    }
}


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


  Comments,     Trackbacks