Мне неизвестно о Win32 (NT) API, похожем на madvise()
.
Однако я бы предложил подход.
Сначала передайте флаг Win32 FILE_FLAG_SEQUENTIAL_SCAN
на CreateFile()
. Это позволит операционной системе Windows лучше буферизовать файл после его открытия.
При FILE_FLAG_SEQUENTIAL_SCAN
ваш анализатор файлов может работать быстрее, если файл находится в памяти. В отличие от madvise()
в Linux, файл не начнет загружаться в память ранее из-за использования флага Win32.
Далее нам нужно запустить файл, чтобы начать загрузку. Асинхронно читайте первую страницу файла, вызывая ReadFileEx()
со структурой OVERLAPPED
и функцией FileIOCompletionRoutine
.
Ваш FileIOCompletionRoutine
может просто вернуться, или вы можете установить событие в перекрывающейся структуре - подробности читайте в MSDN ReadFileEx
.
Поскольку критический сбой не будет, если предварительная выборка не будет завершена, когда вы на самом деле читаете из файла, самой простой реализацией будет «запустить и забыть» - выполнить чтение файла с перекрытием и затем никогда не проверять результат этого. Будьте уверены, что вы читаете данные в допустимые буферы, хотя!
Если вы выполняете эту операцию для файла во время чтения предыдущего файла, результатом должно быть то, что следующий файл начнет подкачку.
Имейте в виду, что это может замедлить вашу производительность. Когда следующий файл начнет вставлять, дисковый ввод-вывод для доступа к этому файлу будет конкурировать с дисковым вводом-выводом для файла, который вы сейчас анализируете. Если два файла физически удалены друг от друга на одном и том же диске, результатом предварительной выборки может стать дополнительная задержка при поиске головки диска. Хотя современные накопители имеют огромные буферы, которые уменьшают это, постановка в очередь первой страницы нового файла может вызвать головную боль.
Предложение bdonlan о потоке предварительной выборки, который асинхронно загружает файлы из обработки, также будет работоспособным решением для Win32.