У меня есть файловый сервер Windows Server 2008 R2, на котором есть несколько больших файлов, которые в редких случаях очень важно скопировать в другую систему как можно быстрее.
Есть ли способ заставить эти файлы всегда кэшироваться в ОЗУ?
В большинстве случаев проблема заключается не столько в передаче файла с диска в ОЗУ, а скорее из ОЗУ в сеть. Если система не сильно увязла в работе или не хватает оперативной памяти, Windows должна достаточно разумно обрабатывать кеширование файлов.
Возможно, вы захотите провести некоторое тестирование и посмотреть, действительно ли в вашей системе есть узкое место, которое заметно улучшится за счет сохранения определенных файлов в памяти по сравнению с заменой на диск, когда Windows считает, что их следует сохранить на диск. Я уверен, что вы сэкономите очень мало времени, поскольку узким местом, скорее всего, будет сеть, и к тому времени, когда файл будет поставлен в очередь для передачи в сеть, диск уже заполняет буферы в памяти, поскольку он извлекает файл из водить машину.
Тем не менее, единственный действительно надежный способ хранить файлы данных в памяти, о котором я знаю, - это создать RAM-диск и скопировать туда файлы, предполагая, что они статические. В противном случае у вас отключится электричество, и они исчезнут.
В противном случае вы можете захотеть инвестировать в много оперативной памяти и высокоскоростные диски. Возможно, даже зеркальная конфигурация RAID, поскольку она имеет высокую производительность чтения (более медленную запись). Я бы позволил Windows и диспетчеру памяти сделать это и сосредоточиться на минимизации времени доступа с помощью более совершенных подсистем (быстрый диск, RAID, много памяти, высокая скорость и высокое качество сетевой карты), а не доводить его до такой степени, что отладка или устранение неполадок может стать еще большей болью в будущем.
Вы можете попробовать суперкэш или другие альтернативные решения для кеширования, или вы можете рассмотреть возможность использования SSD с высокоскоростным доступом для чтения - это довольно легко переполнит практически любое сетевое соединение.
Единственный другой вариант, который я не думаю, соответствует вашим потребностям, но я упомяну его:
Если вы пишете файл в своем приложении, вы можете попробовать создать его с помощью:
FILE_ATTRIBUTE_TEMPORARY и FILE_FLAG_DELETE_ON_CLOSE
Это говорит Windows, чтобы она пыталась хранить файлы в ОЗУ, а не на диске - я не думаю, что это будет соответствовать вашим потребностям, но вы можете прочитать больше на http://msdn.microsoft.com/en-us/library/aa363858%28VS.85%29.aspx#caching_behavior
Стив Радич - http://www.BitShop.com/blogs.aspx
Стандартного способа сделать это не существует. В Windows таких крючков нет. Если это действительно важно для вас, вы можете попробовать поиграть с алгоритмами кэширования файлов Windows, часто обращаясь к файлу из сети. Это должно сохранить файл в кеше, но нет никаких гарантий. IIRC, вам не нужно читать весь файл, чтобы кэшировать весь файл, поэтому чтения подмножества файла должно быть достаточно.
Да, есть способ обмануть диспетчер памяти ОС и загрузить весь файл / папку в кеш системы ОС. Взгляните на сообщение здесь: http://www.arcgis.com/home/item.html?id=08a5a05ff82446bb8a8befad03b1bb86
Вы можете предварительно сопоставить файлы, используя файлы с отображением памяти чтобы ускорить процесс https://www.microsoft.com/store/apps/9N9TWRVC493H