Я пишу программу, которая должна пройти через большой двоичный файл 40 ГБ, но у меня есть только 16 ГБ физической памяти. Друг сказал мне, что я могу использовать сопоставление файлов, чтобы решить эту проблему. Я понимаю как создать сопоставление файлов а также чтение в дескриптор карты файла, и как отображение файлов отображает части файла в постоянной памяти на различные фрагменты виртуальной памяти для чтения.
Так что, если я правильно понимаю, я могу создать буфер, скажем, 10 ГБ, и прочитать первые 10 ГБ файла в этот буфер. Но когда мне нужно будет прочитать отметку 10 ГБ в файле, ОС автоматически получит другой блок для меня или мне придется делать это вручную в моем коде?
Функции, на которые вы ссылаетесь, (напрямую) не связаны с отображением файлов. Они используются для обычного файлового ввода-вывода.
Чтобы использовать традиционный файловый ввод / вывод с очень большим файлом, вы можете сделать, как вы описали. Вы бы открыли файл, создали буфер и прочитали часть файла в буфер. Когда вам нужно получить доступ к другой части файла, вы читаете другой кусок в буфер.
Чтобы использовать сопоставление файлов, вы используете CreateFile, CreateFileMapping, а потом MapViewOfFile. Вы (напрямую) не создаете буфер и не читаете часть файла в него. Вместо этого вы сообщаете системе, что хотите получить доступ к диапазону файла, как если бы это был диапазон адресов памяти. Чтение и запись по этим адресам превращаются в операции ввода-вывода файлов за кулисами. При таком подходе вам, возможно, все равно придется работать кусками. Если та часть файла, к которой вы хотите получить доступ, не находится в диапазоне, который вы в настоящее время сопоставили, вы можете создать другое представление (и, возможно, закрыть другое).
Но обратите внимание, что я сказал адресное пространство, который отличается от баран. Если вы создаете 64-битную версию Windows, вы можете попытаться отобразить весь 40 ГБ файл в свое адресное пространство. Тот факт, что у вас всего 16 ГБ ОЗУ, не остановит вас. При таком размере могут быть некоторые другие проблемы, но это не будет связано с вашей оперативной памятью. Если есть другие проблемы, вы вернетесь к управлению файлом в блоках, как и раньше.