Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > WinAPI
Перезагрузить страницу Как очистить системный кэш
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Member
 
Сообщений: 199
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.10.2005
По умолчанию 23.10.2007, 11:37

Всем доброе время суток.
Есть некоторый файл, содержимое которого я считываю с харда в память. После первого такого прочтения он помещается в системный кэш, и, если второй раз запустить программу - файл считывается почти мгновенно, т.к. сидит в оперативе. Вопрос - как очистить системный кэш, чтобы файл при каждом запуске программы считывался именно с харда?
Ответить с цитированием
  (#2 (permalink)) Старый
Любитель давать советы
 
Сообщений: 4,099
Сказал(а) спасибо: 12
Поблагодарили 39 раз(а) в 39 сообщениях
Регистрация: 16.10.2005
По умолчанию 24.10.2007, 00:28

Сдается мне, что из режима пользователя - никак.
Из режима ядра есть функции Cache Manager, они описаны в IFS KIT
Там надо смотреть в сторону CcPurgeCacheSection

upd
Немножко о Cache Manager
Ответить с цитированием
  (#3 (permalink)) Старый
Member
 
Сообщений: 82
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 13.10.2007
По умолчанию 24.10.2007, 11:04

открывай через CreateFile + FILE_FLAG_NO_BUFFERING
Ответить с цитированием
  (#4 (permalink)) Старый
Member
 
Сообщений: 199
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.10.2005
По умолчанию 24.10.2007, 13:13

To dumb
Похоже, это то, что нужно, только вот есть одно НО:
Цитата:
An application must meet certain requirements when working with files that are opened with FILE_FLAG_NO_BUFFERING:


File access must begin at byte offsets within a file that are integer multiples of the volume sector size.
File access must be for numbers of bytes that are integer multiples of the volume sector size. For example, if the sector size is 512 bytes, an application can request reads and writes of 512, 1024, 1536, or 2048 bytes, but not of 335, 981, or 7171 bytes.
Buffer addresses for read and write operations should be sector aligned, which means aligned on addresses in memory that are integer multiples of the volume sector size. Depending on the disk, this requirement may not be enforced.
В моей программе будет сложновато удовлетворить эти требования, а без них работа с файлом, открытым с FILE_FLAG_NO_BUFFERING, невозможна
Ответить с цитированием
  (#5 (permalink)) Старый
Member
 
Сообщений: 199
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.10.2005
По умолчанию 24.10.2007, 15:29

Да собственно говоря, мне просто нужно было тестить скорость работы программы, а она внутри себя считывает файл в память. Получалось, что после первого запуска она летала. Т.е. мне нужен был не хитрый способ работы с конкретным файлом, а возможность очищать системный кэш в целях тестирования.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Member
 
Сообщений: 82
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 13.10.2007
По умолчанию 24.10.2007, 15:33

никто не мешает сделать "надстройку", реализующую буферизацию чтения. и потом, не совсем ясны причины, заставляющие тебя "считывать именно с харда" - чем тебя работа кэша не устроила?

edit: а, понятно - бенч. тем более - никих проблем, особенно если учесть полное вычитывание в память: открываешь, и вычитываешь блоками, скажем, по 32к. не один раз такое делал и на ограничения ни разу не наткнулся. плохо "тыкался"?..
Ответить с цитированием
  (#7 (permalink)) Старый
Member
 
Сообщений: 199
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.10.2005
По умолчанию 24.10.2007, 15:53

Да я и так блоками вычитываю, проблема в том, что у меня в файле лежит некоторе количество (несколько миллионов) структур, которые мне нужно в память считывать. Так вот, из-за ограничений на стартовый адрес чтения и количество читаемых байт - логика работы получается ну очень непростая. Поэтому меня вполне бы устроили: обычное открытие файла на чтение, а по окончании работы программы вызов некоторой функции, которая бы почистила системный файловый кэш от только что читавшегося файла (впоследствии, этот вызов убрать).
Ответить с цитированием
  (#8 (permalink)) Старый
Любитель давать советы
 
Сообщений: 4,099
Сказал(а) спасибо: 12
Поблагодарили 39 раз(а) в 39 сообщениях
Регистрация: 16.10.2005
По умолчанию 24.10.2007, 21:41

И все-таки ИМХО простейшим решением будет написание маленького драйвера, котрый по запросу из программы будет сбрасывать этот кэш.

Upd Кстати, было бы интересно потестировать, насколько качественно флаг FILE_FLAG_NO_BUFFERING отрубает кэширование. Кто-нибудь реально пробовал?
Ответить с цитированием
  (#9 (permalink)) Старый
Member
 
Сообщений: 199
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.10.2005
По умолчанию 24.10.2007, 22:18

Цитата:
И все-таки ИМХО простейшим решением будет написание маленького драйвера, котрый по запросу из программы будет сбрасывать этот кэш.
Да меня собственно этот вопрос заинтересовал только на период тестирования. Так-то для работы мне это не нужно.

Цитата:
Upd Кстати, было бы интересно потестировать, насколько качественно флаг FILE_FLAG_NO_BUFFERING отрубает кэширование. Кто-нибудь реально пробовал?
Я попробовал. Флаг действительно работает - кэширование выключает.
Ответить с цитированием
  (#10 (permalink)) Старый
Member
 
Сообщений: 1,324
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.07.2007
По умолчанию 25.10.2007, 12:13

Цитата:
И все-таки ИМХО простейшим решением будет написание маленького драйвера
Если это ТАК просто, то нельзя ли примерчик или хоть ссылочку?
Ответить с цитированием
  (#11 (permalink)) Старый
Любитель давать советы
 
Сообщений: 4,099
Сказал(а) спасибо: 12
Поблагодарили 39 раз(а) в 39 сообщениях
Регистрация: 16.10.2005
По умолчанию 25.10.2007, 14:22

Цитата:
Если это ТАК просто, то нельзя ли примерчик или хоть ссылочку?
Я же не сказал, что ТАК просто - сказал НАИБОЛЕЕ просто.
Один раз сбросить реально сбросить кэш, чем отслеживать все возможные места чтения с целью обойти кэш.
Опять же, при предложенном способе будет разница во времени - ровно на операцию помещения данных в кэш, что может быть немалым при больших объемах чтения.

Насчет простоты. По той ссылке, которую я уже давал, в общих чертах расписано, что должен делать этот драйвер. На RSDN можно найти и более подробную информацию.

Анекдот про трех академиков я уже приводил.
Ответить с цитированием
  (#12 (permalink)) Старый
Member
 
Сообщений: 1,324
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.07.2007
По умолчанию 26.10.2007, 01:16

Цитата:
Насчет простоты. ... Анекдот про трех академиков я уже приводил.
+1

Цитата:
Один раз сбросить реально сбросить кэш, чем отслеживать все возможные места чтения с целью обойти кэш.
Опять же, при предложенном способе будет разница во времени - ровно на операцию помещения данных в кэш, что может быть немалым при больших объемах чтения.
Меня вопрос давно интересует, т.к. есть такой глюк - по крайней мере, в Билдере, не знаю, как там дальше - а может, и не глюк, а так задумано - но неудобно. Короче, я с этой тонкостью застрял - закрываешь одно окно по OnKeyUp(), а следующее за ним почему-то тоже получает его, и тоже реагирует! Может, я неграмотно делаю - может, надо OnKeyPress() ловить... Но оно не всегда подходит. Вот если бы в OnActivate() очищался буфер... А то приходится вести танцы с бубном - собственные контрольные флаги ставить... Надоело.

Ссылки почитаю.
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
очистить кэш evgeniy1 Любые вопросы от новичков 0 29.02.2012 15:17
Очистить все пункты в PopUpMenu videomag C++ Builder 6 29.01.2012 21:30
Не могу очистить корзину FaL_LoV Любые вопросы от новичков 4 09.08.2011 11:21
Как очистить клавиатуру от пива? Шурко Любые вопросы от новичков 6 12.03.2009 00:29
DB2 как очистить таблицы Voin Другие СУБД 4 28.09.2007 13:18
Как очистить ListBox1 Items Lavaza C++ Builder 3 15.08.2007 11:53
Как очистить SystemTray Anonymous Visual C++ 20 21.11.2006 14:24
Как очистить TImage от картинки Виталик C++ Builder 6 25.07.2006 15:13
Как програмно очистить корзину asterix C++ Builder 1 20.04.2004 00:50
Как очистить память кеш lpn Visual C++ 5 16.04.2004 14:40
Как EDIT очистить Tox Visual C++ 1 18.01.2004 19:48
Как очистить clipboard Anonymous Visual C++ 1 01.08.2003 09:50



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов