Я записываю около сотни файлов размером 50 МБ каждый последовательно в каталог на моем диске, используя CreateFile()
и WriteFile()
. На втором этапе содержимое этих файлов считывается с использованием CreateFile()
и ReadFile()
.
Я заметил несколько странных вещей:
Если я пропущу FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH
при записи файлов, чтение займет заметно много времени (обычно сотни миллисекунд). Однако, когда я не передаю эти флаги (а использую вместо них FlushFileBuffers()
), запись происходит примерно с той же скоростью, но чтение этих файлов после их записи происходит невероятно быстро (менее 20 миллисекунд на файл!).
Как это возможно? Как флаги, переданные при записи 5000 МБ данных, влияют на чтение позже? Кэширует ли диск все 5 ГБ в своей кэш-памяти?
FlushFileBuffers()
после каждой записи, и мне интересно, будут ли в Windows эти файлы в кеше даже после использованияFlushFileBuffers()
. 25.01.2016FlushFileBuffers()
. Согласно Microsoft: данные файла в системном файловом кэше записываются на диск с интервалами, определяемыми операционной системой, и память, ранее использовавшаяся этими файловыми данными, освобождается - это называется очисткой кеша. [...] Процесс также может принудительно очистить открытый им файл, вызвав функцию FlushFileBuffers. Я что-то неправильно понял? Где я не прав? 25.01.2016FlushFileBuffers
и без него при опусканииFILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH
. Очистка буферов не приведет к удалению данных из кеша. 25.01.2016