0

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

Файл ~ 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); 
    } 

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

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

+1

Я определенно не использовал бы 'PAGE_EXECUTE_READWRITE' или' GENERIC_EXECUTE' для файла данных. –

+2

После того, как вы использовали достаточное количество файла для заполнения свободной памяти, доступ к новому блоку требует замены другого блока. Конечно, это будет замедляться. –

+0

Какова типичная схема доступа? Получаете ли вы доступ к файлу в случайном порядке или последовательно? Вы касаетесь всего файла или его частей? Ваше представление доступно только для чтения, но вы открываете все остальное с помощью read/write execute (!). Не запрашивайте больше доступа, чем вам нужно, поскольку это может создавать ограничения, замедляющие работу. –

ответ

1

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

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

+0

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

+0

@ user2521432 диски оптимизированы для последовательного доступа (даже SSD), и это типичный шаблон доступа, поэтому все быстро. Всякий раз, когда вы делаете интенсивный случайный доступ к файлу, он будет медленным, независимо от того, читаете ли вы его напрямую или позволяете ОС делать это с помощью сопоставления памяти. –

 Смежные вопросы

  • Нет связанных вопросов^_^