Windows C++ Заблокировать файл в памяти

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

Мне кажется, что что-то (винда или диск) кеширует файл и поэтому фриды очень быстрые. Я ничего не читал об этом поведении, поэтому я не уверен, что на самом деле вызывает это.

Если я не использую свое приложение в течение 1 часа или около того, а затем снова делаю fread, fread работает медленно. Мне кажется, что кеш опустел.

Может ли кто-нибудь объяснить мне это поведение? Я хотел бы активно использовать его. Для меня проблема, когда фриды медленные.

Memory-mapping файл работает теоретически, но сам файл слишком большой, поэтому я не могу его использовать.


person tmighty    schedule 11.10.2013    source источник
comment
В Windows есть дисковый кеш, и он работает довольно хорошо. Ожидать, что Windows будет хранить ваши данные в этом кеше часами/днями, не так уж и дружелюбно. Что делает ВАШИ данные настолько более важными, чем данные чего-либо ДРУГОГО в системе?   -  person Marc B    schedule 11.10.2013
comment
Мне нужно быстро выполнять фриды, поэтому я пытался найти способ сообщить Windows, что файл важен для меня, и мне нужно часто и быстро получать к нему доступ.   -  person tmighty    schedule 12.10.2013
comment
просто прочитайте это... оно будет кэшировано. пока вы продолжаете его читать, Windows должна хранить его в кэше. вы нажмете медленное чтение только ОДИН РАЗ после того, как он загрузится из кеша.   -  person Marc B    schedule 12.10.2013
comment
Если отображение файла в память невозможно, потому что файл слишком велик, то и хранить его в ОЗУ также невозможно. Но также нет никакого способа, чтобы кеш работал в вашу пользу. Если страницы, которые вам нужны, не помещаются в ОЗУ (или больше вашего адресного пространства), они также не поместятся в буферном кеше. Тем не менее, сопоставление памяти поддиапазонов файла, который вам нужен, является почти единственным способом заставить ОС хранить их, и даже в этом случае вы не уверены, поскольку не можете заблокировать много мегабайт. Просто скорее всего, не точно. Я рекомендую против таких трюков, хотя.   -  person Damon    schedule 12.10.2013


Ответы (1)


закон 90/10

90% времени выполнения компьютерной программы тратится на выполнение 10% кода

Это не правило, но обычно так и есть, поэтому многие программы стараются по возможности сохранять последние данные, потому что весьма вероятно, что к этим данным очень скоро снова будут обращаться.

ОС Windows не является исключением, после получения команды на чтение файла ОС сохраняет некоторые данные о файле. Он хранит в памяти адреса возрастов, в которых хранится программа, если возможно, даже сохраняет часть (или даже все) двоичных данных в памяти, это делает чтение следующего файла намного быстрее, если это чтение происходит сразу после первого.

В целом вы правы, что кеширование есть, но я не могу сказать, что это действительно происходит, так как я не работаю в Microsoft...


Также отвечая на следующую часть вопроса. Отображение файла в память может быть решением, но если файл очень большой, у машины может не быть достаточно памяти, поэтому это не вариант. Однако вы можете использовать закон 90/10. В вашем случае у вас должна быть отображена только часть файла в память (та часть, которая является наиболее важной), также при чтении вы должны составить таблицу данных общих параметров.

Точной ситуации не знаю, но может спасти.

person ST3    schedule 11.10.2013