Измените права доступа к файлам с '0664' на '0644'
Почему сделай сам?
Если только необходимо определить скорость диска и не действительно заинтересованные изучением, как сбросить буферы ввода-вывода от.NET, можно просто использовать утилиту DiskSpd из http://research.microsoft.com/barc/Sequential_IO/. Это имеет случайные/последовательные режимы с и без буферного сбрасывания.
Страница также имеет некоторые связанные с вводом-выводом отчеты по результатам исследования, которые Вы могли бы найти полезным.
const int FILE_FLAG_NO_BUFFERING = 0x20000000;
return new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read,64 * 1024,
(FileOptions)FILE_FLAG_NO_BUFFERING | FileOptions.Asynchronous
& FileOptions.SequentialScan);
Я нашел эту статью, и кажется, что это - сложная программа, потому что также необходимо сбросить другие кэши.
Constantin:Спасибо! та ссылка имеет командную строку EXE, который делает тестирование, которое я искал.
Я также нашел ссылку от той страницы к более интересной статье (в Word и PDF) на этой странице: Последовательные Шаблоны программирования Файла и Производительность с.NET
В этой статье это говорит об Освободившей буфер Производительности Файла (iow, никакое кэширование чтения-записи - просто производительность неструктурированного диска.)
Заключенный в кавычки непосредственно из статьи:
Нет никакого простого способа отключить буферизацию FileStream в платформе.NET V2. Нужно вызвать файловую систему Windows непосредственно, чтобы получить освободивший буфер дескриптор файла и затем 'перенести' результат в FileStream следующим образом в C#:
[DllImport("kernel32", SetLastError=true)]
static extern unsafe SafeFileHandle CreateFile(
string FileName, // file name
uint DesiredAccess, // access mode
uint ShareMode, // share mode
IntPtr SecurityAttributes, // Security Attr
uint CreationDisposition, // how to create
uint FlagsAndAttributes, // file attributes
SafeFileHandle hTemplate // template file
);
SafeFileHandle handle = CreateFile(FileName,
FileAccess.Read,
FileShare.None,
IntPtr.Zero,
FileMode.Open,
FILE_FLAG_NO_BUFFERING,
null);
FileStream stream = new FileStream(handle,
FileAccess.Read,
true,
4096);
Вызов CreateFile () с флагом FILE_FLAG_NO_BUFFERING говорит файловой системе обходить всю память программного обеспечения, кэширующуюся для файла. 'Истинное' значение передало как третий аргумент конструктору FileStream, указывает, что поток должен взять владение дескриптора файла, означая, что дескриптор файла будет автоматически закрыт, когда поток будет закрыт. После этого фокуса-покуса освободивший буфер поток файла считан и записан таким же образом как любой другой.
Отклик Fix был почти правильным и лучше, чем PInvoke. Но в нем есть ошибки , и он не работает ...
Чтобы открыть файл без кеширования, необходимо сделать следующее:
const FileOptions FileFlagNoBuffering = (FileOptions)0x20000000;
FileStream file = new FileStream(fileName, fileMode, fileAccess, fileShare, blockSize,
FileFlagNoBuffering | FileOptions.WriteThrough | fileOptions);
Несколько правил:
также HDD Cache (который медленнее и меньше, чем кеш ОС), который вы не можете отключить этим (но иногда FileOptions.WriteThrough помогает не кэшировать записи). С этими параметрами у вас нет причин для сброса, но убедитесь, что вы правильно проверили, что этот подход не замедлит работу, если ваша реализация кеша будет медленнее.