Ответ 1
Используйте приложение SysInternal RAMMap.
Параметр "Пустой/пустой резервный список" очистит кеш файл Windows.
Какие инструменты или методы я могу использовать для удаления содержимого кэшированных файлов, чтобы предотвратить искажение результатов моей работы? Я считаю, что мне нужно либо полностью очистить, либо выборочно удалить кэшированную информацию о содержимом файла и каталога.
Приложение, которое я разрабатываю, является специализированной утилитой сжатия, и ожидается, что он будет выполнять большую работу по чтению и записи файлов, которые операционная система не затронула в последнее время, и чьи блоки диска вряд ли будут кэшироваться.
Я хочу удалить изменчивость, которую я вижу во время ввода-вывода, когда я повторяю задачу профилирования различных стратегий для работы с файловой обработкой.
Я в первую очередь интересуюсь решениями для Windows XP, так как это моя основная машина разработки, но я также могу протестировать с помощью Linux, и поэтому мне тоже интересны ответы для этой среды.
Я попробовал SysInternals CacheSet, но нажатие "Очистить" не приводит к измеримому увеличению (восстановление по времени после холодного ботинка) во время перечитания файлов, которые я только что прочитал несколько раз.
Используйте приложение SysInternal RAMMap.
Параметр "Пустой/пустой резервный список" очистит кеш файл Windows.
Быстрый поиск в Google дает эти опции для Linux
sync && echo 1 >/proc/sys/vm/drop_caches
Для Windows XP вы должны очистить кеш для определенного файла, открыв файл с помощью CreateFile с параметрами FILE_FLAG_NO_BUFFERING и затем закройте дескриптор. Это не документировано, и я не знаю, работает ли оно на более поздних версиях Windows, но я использовал это давно, когда писал тестовый код для сравнения библиотек сжатия файлов. Я не помню, чтобы доступ к чтению или записи повлиял на этот трюк.
Утилита командной строки может быть найдена здесь
из источника:
EmptyStandbyList.exe
- это средство командной строки для Windows (Vista и выше), которое может очищать:
- обрабатывать рабочие комплекты,
- измененный список страниц,
- резервные списки (приоритеты от 0 до 7) или
- только резервный список с приоритетом 0.
Использование:
EmptyStandbyList.exe workingsets|modifiedpagelist|standbylist|priority0standbylist
Я нашел один метод (кроме перезагрузки), который работает:
Это не выборочно. В идеале я хотел бы очистить определенные части памяти, которые используются для кэширования блоков диска, которые я хочу больше не кэшировать.
#include <fcntl.h>
int posix_fadvise(int fd, off_t offset, off_t len, int advice);
с подсказкой POSIX_FADV_DONTNEED
:
Указанные данные не будут доступны в ближайшем будущем.
Для гораздо лучшего представления о кэше файловой системы Windows XP - попробуйте ATM от Tim Murgent - он позволяет вам видеть как кеш файловой системы. Установите размер и размер списка ожидания в более подробном и точном виде. Для Windows XP вам нужна старая версия 1 ATM, которая доступна для загрузки здесь, поскольку V2 и V3 требуется сервер 2003, Vista или выше.
Вы заметите, что хотя Sysinternals Cacheet уменьшит "Cache WS Min" - фактические данные все еще продолжают существовать в виде режима ожидания списки, из которых он может быть использован, пока он не будет заменен чем-то другим. Чтобы затем заменить его на что-то еще, используйте инструмент, например MemAlloc или flushmem от Chad Austin или Consume.exe из Инструменты набора ресурсов Windows Server 2003.
Поскольку вопрос также задан для Linux, есть связанный ответ здесь.
Инструмент командной строки vmtouch позволяет, помимо прочего, добавлять и удалять файлы и каталоги из кеша системного файла.
Есть вызов Windows API https://docs.microsoft.com/en-us/windows/desktop/api/memoryapi/nf-memoryapi-setsystemfilecachesize, который можно использовать для очистки кэша файловой системы. Его также можно использовать для ограничения размера кэша очень маленьким значением. Выглядит идеально для такого рода тестов.