Файл с отображением памяти работает медленно

Я пытаюсь читать из файла с отображением памяти, но доступ к файлу занимает много времени. Я сопоставляю весь файл со своей программой, и первоначальный доступ к быстрому, но затем он начинает резко тормозить

Файл ~ 47 ГБ, а у меня 16 ГБ ОЗУ. Я запускаю 64-битное приложение в Windows 7, используя Visual Studios в качестве своей IDE. Ниже приведен фрагмент моего кода

    hFile = CreateFile( "Valid Path to file",                // name of the write
                        GENERIC_READ , // open for reading
                        0,                      // do not share
                        NULL,                   // default security
                        OPEN_EXISTING,             // existing file only
                        FILE_ATTRIBUTE_NORMAL,  // normal file
                        NULL);                  // no attr. template

    if (hFile == INVALID_HANDLE_VALUE)
    {
        cout << "Unable to open vals" << endl;
        exit(1);
    }

    hMapFile = CreateFileMapping(
                                hFile,              
                                NULL,                        // default security
                                PAGE_READONLY,      // read/write access
                                0,                           // maximum object size (high-order DWORD)
                                0,                           // maximum object size (low-order DWORD)
                                NULL);                       // name of mapping object

    if (hMapFile == NULL)
    {
        cout<< "Error code " << GetLastError() << endl;
        exit(1);
    }



     data = (float*) MapViewOfFile(
                            hMapFile,
                            FILE_MAP_READ,
                            0,
                            0,
                            0);

    if (data == NULL)
    {
        cout << "Error code " << GetLastError() << endl;

        CloseHandle(hFile);

        exit(1);
    }

Это только потому, что файл настолько велик, что постоянная замена фрагментов файла занимает много времени, или это какой-то другой параметр, который мне нужен для более быстрого доступа?

РЕДАКТИРОВАТЬ: я пытался использовать только чтение вместо чтения, записи, выполнения, как показано выше, но скорость по-прежнему низкая. Я понимаю концепции отображения памяти и переключения пространства подкачки, но я подумал, что, возможно, я делаю что-то еще не так, что мешает скорости


person IkeJoka    schedule 14.07.2015    source источник
comment
Я определенно не стал бы использовать PAGE_EXECUTE_READWRITE или GENERIC_EXECUTE для файла данных.   -  person Ben Voigt    schedule 14.07.2015
comment
После того, как вы использовали достаточно файла, чтобы заполнить доступную оперативную память, доступ к новому блоку требует замены другого блока. Конечно будет тормозить.   -  person Mark Ransom    schedule 14.07.2015
comment
Какова ваша типичная схема доступа? Вы обращаетесь к файлу в случайном порядке или последовательно? Вы трогаете весь файл или только его часть? Ваше представление доступно только для чтения, но вы открываете все остальное с помощью чтения/записи и выполнения (!) .. Не запрашивайте больше доступа, чем вам нужно, так как это может создать ограничения, замедляющие работу.   -  person Adrian McCarthy    schedule 14.07.2015


Ответы (1)


Это из-за пейджинга. Происходит то, что ваша оперативная память может содержать только 16 ГБ файла (на самом деле это меньше из-за других программ, работающих на вашем компьютере, но давайте просто используем это для простоты).

Поэтому, если вы получаете доступ к части файла в вашей программе, которая не находится в оперативной памяти (скажем, к части файла, которая находится в сегменте 20 ГБ), ваша оперативная память должна общаться с диском и передавать совершенно новый сегмент файла. в ОЗУ. Это занимает много времени.

person Lawrence Aiello    schedule 14.07.2015
comment
Но тогда как другие приложения, обращающиеся к большим файлам, по-прежнему остаются в основном отзывчивыми. Это через многопоточность, чтобы каждый поток просматривал разные части файла? - person IkeJoka; 14.07.2015
comment
Диски @ user2521432 оптимизированы для последовательного доступа (даже для твердотельных накопителей), и это типичный шаблон доступа, поэтому все происходит быстро. Всякий раз, когда вы выполняете интенсивный произвольный доступ к файлу, он будет медленным, независимо от того, читаете ли вы его напрямую или позволяете ОС делать это через отображение памяти. - person Mark Ransom; 14.07.2015