Падение производительности с fputs после записи более 2,5 ГБ. Почему?

В настоящее время я работаю над небольшой программой, которая читает большие файлы и сортирует их. После некоторого тестирования я наткнулся на странную проблему с производительностью. Когда входной файл стал большим, запись выходного файла заняла больше времени, чем фактическая сортировка. Итак, я углубился в код и, наконец, понял, что проблема может быть в функции fputs.Итак, я написал эту небольшую программу для тестирования производительности.

#include "stdio.h"
#include "ctime"

int main()
{
    int i;
    const int linecount = 50000000;
    //Test Line with 184 byte
    const char* dummyline = "THIS IS A LONG TEST LINE JUST TO SHOW THAT THE WRITER IS GUILTY OF GETTING SLOW AFTER A CERTAIN AMOUNT OF DATA THAT HAS BEEN WRITTEN. hkgjhkdsfjhgk jhksjdhfkjh skdjfhk jshdkfjhksjdhf\r\n";
    clock_t start = clock();
    clock_t last = start;

    FILE* fp1 = fopen("D:\\largeTestFile.txt", "w");
    for(i=0; i<linecount; i++){
        fputs(dummyline, fp1);
        if(i%100000==0){
            printf("%i Lines written.\r", i);
            if(i%1000000 == 0){
                clock_t ms = clock()-last;
                printf("Writting of %i Lines took %i ms\n", i, ms);
                last = clock();
            }
        }
    }
    printf("%i Lines written.\n", i);
    fclose(fp1);
    clock_t ms = clock()-start;
    printf("Writting of %i Lines took %i ms\n", i, ms);

}

Когда вы выполняете программу, вы можете увидеть явное падение производительности примерно после 14-15 миллионов строк, что составляет примерно 2,5 ГБ данных. Написание занимает примерно в 3 раза больше времени, чем раньше. Порог в 2 ГБ указывает на 64-битную проблему, но я ничего не нашел об этом в Интернете. Я также проверил, есть ли разница между двоичным и символьным режимами (например, «wb» и «w»), но ее нет. Я также попытался предварительно выделить размер файла (чтобы избежать фрагментации файла), перейдя к ожидаемому концу и записав нулевой байт, но это также практически не имело никакого эффекта.

Я использую 64-битную машину с Windows 7, но я также тестировал ее на 64-битной машине с Windows Server 2008 R1. В настоящее время я тестирую файловую систему NTFS с более чем 200 ГБ свободного места. В моей системе 16 ГБ оперативной памяти, так что это тоже не должно быть проблемой. В тестовой программе используется всего около 700 КБ. Ошибок страниц, о которых я подозревал ранее, также очень мало (~ 400 ошибок страниц за все время выполнения).

Я знаю, что для таких больших данных функция fwrite () лучше подходит для этой задачи, но на данный момент мне интересно, есть ли другой обходной путь и почему это происходит. Любая помощь будет высоко ценится.

8
задан Aceonline 16 November 2011 в 09:08
поделиться