Как опустеть/сбросить дисковый кэш Windows READ в C#?

Измените права доступа к файлам с '0664' на '0644'

7
задан Pretzel 24 September 2008 в 17:32
поделиться

5 ответов

Почему сделай сам?

Если только необходимо определить скорость диска и не действительно заинтересованные изучением, как сбросить буферы ввода-вывода от.NET, можно просто использовать утилиту DiskSpd из http://research.microsoft.com/barc/Sequential_IO/. Это имеет случайные/последовательные режимы с и без буферного сбрасывания.

Страница также имеет некоторые связанные с вводом-выводом отчеты по результатам исследования, которые Вы могли бы найти полезным.

4
ответ дан 6 December 2019 в 05:56
поделиться
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);
3
ответ дан 6 December 2019 в 05:56
поделиться

Я нашел эту статью, и кажется, что это - сложная программа, потому что также необходимо сбросить другие кэши.

0
ответ дан 6 December 2019 в 05:56
поделиться

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, указывает, что поток должен взять владение дескриптора файла, означая, что дескриптор файла будет автоматически закрыт, когда поток будет закрыт. После этого фокуса-покуса освободивший буфер поток файла считан и записан таким же образом как любой другой.

13
ответ дан 6 December 2019 в 05:56
поделиться

Отклик Fix был почти правильным и лучше, чем PInvoke. Но в нем есть ошибки , и он не работает ...

Чтобы открыть файл без кеширования, необходимо сделать следующее:

const FileOptions FileFlagNoBuffering = (FileOptions)0x20000000;

FileStream file = new FileStream(fileName, fileMode, fileAccess, fileShare, blockSize,
    FileFlagNoBuffering | FileOptions.WriteThrough | fileOptions);

Несколько правил:

  1. blockSize должен быть кластером жесткого диска размер выровнен (4096 большую часть времени)
  2. изменение позиции файла должно быть выровнено по размеру кластера
  3. вы не можете читать / писать меньше, чем blockSize или блок не выровнен по его размеру

также HDD Cache (который медленнее и меньше, чем кеш ОС), который вы не можете отключить этим (но иногда FileOptions.WriteThrough помогает не кэшировать записи). С этими параметрами у вас нет причин для сброса, но убедитесь, что вы правильно проверили, что этот подход не замедлит работу, если ваша реализация кеша будет медленнее.

11
ответ дан 6 December 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: