Как преодолеть ошибку памяти при чтении большого файла (более 1 ГБ) - C / C ++ - PullRequest
0 голосов
/ 27 августа 2011

Я пытаюсь прочитать файл размером более 1 ГБ (который имеет 1 157 421 364 байта), он выдает ошибку памяти при использовании функции fread (), но хорошо работает при использовании функции fgets (). Примечание: я смешал C и C ++ ..

Может кто-нибудь помочь мне преодолеть эту ошибку памяти, я что-то не так делаю?

Заранее спасибо ...

Ошибка «Ошибка памяти»


#include &ltiostream>
#include &ltcstdlib>
#include &ltcstdio>
#include &ltcerrno>
#include &ltcstring>

void read_file2(FILE* readFilePtr){
    long file_size;

    fseek(readFilePtr, 0L, SEEK_END);
    file_size = ftell(readFilePtr);
    rewind(readFilePtr);

    char *buffer;
    buffer = (char*) malloc (sizeof(char)*file_size);
    if (buffer == NULL) {
        fputs("Memory Error", stderr);
        exit(2);
    }
    long lines = 0;
    if (fread(buffer, 1, file_size, readFilePtr) != file_size){
        fputs("Reading Error", stderr);
        exit(1);
    }
    char *p = buffer;
    while (p = (char*) memchr(p, '\n', (buffer + file_size) - p)){
        ++p;
        ++lines;
    }
    printf("Num of lines %ld\n", lines);
    free(buffer);
}

int main(int argc, char** argv){
    clock_t begin_time, end_time;
    float time_consumed;

    begin_time = clock();

    FILE* inputFilePtr = fopen(argv[1], "rb");

    if(inputFilePtr == NULL){
        printf("Error Opening %s: %s (%u)\n", argv[1], strerror(errno), errno);
        return 1;
    }

    read_file2(inputFilePtr);

    end_time = clock();

    time_consumed = ((float)end_time - (float)begin_time)/CLOCKS_PER_SEC;
    printf("Time consumed is -- %f\n", time_consumed);
    return 0;
}

Ответы [ 2 ]

4 голосов
/ 27 августа 2011

Вы можете читать файл порциями, вместо того, чтобы читать его целиком, чтение всего файла в один выделенный буфер означает огромное выделение памяти для вашего приложения, вы действительно этого хотите ?.Это говорит о том, что вам не нужно обрабатывать все сразу (что верно в большинстве случаев).

0 голосов
/ 27 августа 2011

Обычно вы не читаете большие файлы за один раз. Вы используете то, что называется буферизованным чтением. По сути, вы непрерывно вызываете fread в цикле, пока не останется ничего для чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...