производительность при последовательном доступе к файлу на сетевом сервере после случайного доступа к нему

Я работаю над собственным приложением C ++ / Win32 / MFC в Windows 7. Я использую CFile для открытия файла, хранящегося на удаленном сервере (с флагами CFile :: modeRead | CFile :: shareDenyWrite). Сервер работает под управлением Windows Server 2008, и я получаю доступ к файлу на общем диске через обычный общий доступ к файлам Windows. Открыв файл, я читаю его, как описано ниже.

Во-первых, я ищу несколько мест в файле (10 мест) и читаю небольшие (128 байт) разделы. Затем я ищу начало и последовательно читаю весь файл.

Я заметил, что выполнение описанного выше было НАМНОГО медленнее, чем просто открытие файла и его чтение.Первоначальный случайный поиск и выборка выполняются очень быстро, почти мгновенно даже с большим файлом. Что интересно, хотя это и быстро, следующая часть, сканирование файла очень медленное по сравнению с простым сканированием без начального произвольного доступа.

Пытаясь понять, что происходит, я подключил монитор производительности и посмотрел сетевой трафик. Если я просто выполняю последовательное чтение файла, я получаю скорость загрузки 3,5 МБ / с через беспроводной адаптер. Если я сначала произвольно ищу вокруг, а затем последовательно просматриваю, я получаю только 300 КБ / с во время последовательного чтения.

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

Таким образом, кажется, что выполнение операций чтения с произвольным доступом (поиск и чтение) сделало что-то на сервере, что затем привело к медленному последовательному чтению. Мне интересно, знает ли кто-нибудь наверняка, что здесь происходит, и какова реальная причина поведения, которое я наблюдаю? Хотя у меня есть исправление, я хотел бы лучше понять, что происходит под капотом, чтобы вызвать это.

5
задан Nerdtron 9 January 2012 в 00:18
поделиться