Я пытаюсь прочитать из файла с отображением памяти, но доступ к файлу занимает много времени. Я сопоставляю весь файл с моей программой и начальный доступ к быстрому, но затем он начинает резко замедляться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: Я попытался использовать только чтение, вместо того чтобы использовать чтение, запись, выполнение, как показано выше, но скорость все еще медленная. Я понимаю понятия картографирования памяти и места переключения коммутатора, но я думал, что, возможно, делал что-то еще не так, чтобы препятствовать скорости
Я определенно не использовал бы 'PAGE_EXECUTE_READWRITE' или' GENERIC_EXECUTE' для файла данных. –
После того, как вы использовали достаточное количество файла для заполнения свободной памяти, доступ к новому блоку требует замены другого блока. Конечно, это будет замедляться. –
Какова типичная схема доступа? Получаете ли вы доступ к файлу в случайном порядке или последовательно? Вы касаетесь всего файла или его частей? Ваше представление доступно только для чтения, но вы открываете все остальное с помощью read/write execute (!). Не запрашивайте больше доступа, чем вам нужно, поскольку это может создавать ограничения, замедляющие работу. –