Пользовательская предварительная выборка - PullRequest
1 голос
/ 13 октября 2009

Какие-нибудь программные методы, переносимые или специфичные для NT и Linux, которые быстрее получают результат от загрузки больших файлов? Я за «опережением времени», априором, как бы вы ни называли это механизмами, которые я могу контролировать в коде для двух ОС в вопросе.

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

Ответы [ 2 ]

4 голосов
/ 14 октября 2009

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

В качестве альтернативы, более переносимым вариантом было бы просто вручную выполнить чтение в отдельном потоке из потока обработки буфера - то есть считывать данные, чтобы заполнить буфер X МБ в потоке A, обрабатывать его так быстро, как вы можете в теме Б.

2 голосов
/ 14 октября 2009

Мне неизвестно о 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.

...