Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Кэширование файла в оперативку


Автор: 12usver12 18.10.2013, 21:43
Ситуация такова, есть внешняя консольная программа, которую выполняют через командную строку, программа имеет большую базу данных около 300 мб в виде одного файла. 
Работает так: запрос от клиента, запускается программа , считывается база данных в память (при этом идет медленная и ресурсоемкая задача считывания с винта), 3-4 сек прога отработала выдала результат и закрылась и так по кругу в несколько потоков. Из-за чего катасрофически падает производительность т.к. ограничена скорость с чтения с медленного магнитного винта. 

Хотелось бы какое-то решение на уровне ос, кэширования этого файла базы данных в оперативную память т.к. он не изменяется, чтобы он подгружался не с диска, а с памяти сразу. На эту внешнюю программу я не могу повлияеть и перестроить ее.  
Что можно придумать ? Интересует как програмное (через винапи какие-нить) так и готовое какое-нибудь решение на уровне какого-то по или функции ос. 
   

Автор: 12usver12 18.10.2013, 23:00
кажется решил проблему свою softperfect.com/products/ramdisk/     
без драйвера тут не обойтись 

Автор: GremlinProg 19.10.2013, 07:35
Цитата(12usver12 @  19.10.2013,  01:00 Найти цитируемый пост)
ramdisk

ага, верное направление!

Автор: o2n3e 19.10.2013, 07:48
Модератор: Сообщение скрыто.

Автор: volatile 19.10.2013, 10:56
Цитата(o2n3e @  19.10.2013,  07:48 Найти цитируемый пост)
Какраз-таки в нормальных ОС - есть нормальный файловый кеш

Можно подумать в венде этого нет.
Этот способ будет точно также работать и в венде, как и в никсе, только это ламерский способ.
Вполне может получиться так, что при следующем обращении к файлу, он уже будет благополучно замещен в кеше другим.
Потому-что попадание зависит от параметров кеширования, от частоты обращения к этому файлу, от частоты обращений к диску других приложений (одним словом от фазы луны).
Лучше уж вы бы как раньше, просто "учили жить" без конкретики, за умного может бы сошли ... smile  (для некоторых наивных школьников)  smile 

Автор: 12usver12 19.10.2013, 13:33
volatile +1
если учесть что и оперативки не так уж и много, кто ж его будет кэшить то постоянно

Автор: akizelokro 19.10.2013, 23:23
memory-mapped files

Автор: feodorv 19.10.2013, 23:55
Цитата(akizelokro @  20.10.2013,  00:23 Найти цитируемый пост)
memory-mapped files 

Цитата(12usver12 @  18.10.2013,  22:43 Найти цитируемый пост)
есть внешняя консольная программа

Возможно, эта "внешняя консольная программа" уже пользуется mmap'ом, возможно, что и нет (и не понятно, есть ли возможность переписать её под mmap). Для нескольких потоков это не плохой вариант (понятно, что даже при этом файл не будет постоянно в оперативной памяти). Но если программа сильно "внешняя", приходится искать другие пути.


Цитата(12usver12 @  19.10.2013,  00:00 Найти цитируемый пост)
кажется решил проблему свою softperfect.com/products/ramdisk/

Цитата(12usver12 @  19.10.2013,  14:33 Найти цитируемый пост)
если учесть что и оперативки не так уж и много

Ramdisk сожрёт часть оперативной памяти, могут начаться проблемы с производительностью ОС. Наряду с ramdisk'ом было бы недурно доставить памяти...

Автор: volatile 20.10.2013, 10:22
Цитата(akizelokro @  19.10.2013,  23:23 Найти цитируемый пост)
memory-mapped files 

Это не влияет на кеширование.
При открытии он не считывается в кеш.
При долгом не обращении (при активной работе других приложений с диском), уходит из кеша.
В общем ничем практически не отличается от обычных read() write() в плане кешированя.

Автор: akizelokro 20.10.2013, 18:20
Цитата(volatile @  20.10.2013,  10:22 Найти цитируемый пост)
При открытии он не считывается в кеш.
При долгом не обращении (при активной работе других приложений с диском), уходит из кеша.
В общем ничем практически не отличается от обычных read() write() в плане кешированя.


Никто не мешает батник написать или запустить этот выполняемый файл как процесс из самописного внешнего. Эти два решения никак не отрицаются в первоначальной постановке задачи, так что для справки, что бывает и такое, подойдёт. А дальше решать уже автору темы.

Автор: GremlinProg 20.10.2013, 21:04
Цитата(akizelokro @  20.10.2013,  20:20 Найти цитируемый пост)
Никто не мешает батник написать или запустить этот выполняемый файл как процесс из самописного внешнего. Эти два решения никак не отрицаются в первоначальной постановке задачи, так что для справки, что бывает и такое, подойдёт. А дальше решать уже автору темы.
А чем родительский процесс поможет дочернему, если дочерний читает базу напрямую из файла?
Цитата(volatile @  20.10.2013,  12:22 Найти цитируемый пост)
Это не влияет на кеширование.При открытии он не считывается в кеш.При долгом не обращении (при активной работе других приложений с диском), уходит из кеша.В общем ничем практически не отличается от обычных read() write() в плане кешированя.

Вобщем-то, и RAM-диск вроде не должен хранить данные в физической памяти. В этом плане, решение с memory-mapped files аналогичное. Но, учитывая:
Цитата(12usver12 @  18.10.2013,  23:43 Найти цитируемый пост)
Хотелось бы какое-то решение на уровне ос
и
Цитата(12usver12 @  18.10.2013,  23:43 Найти цитируемый пост)
На эту внешнюю программу я не могу повлияеть и перестроить ее.
RAM-диск все же логичнее.

Автор: volatile 20.10.2013, 21:38
Цитата(GremlinProg @  20.10.2013,  21:04 Найти цитируемый пост)
Вобщем-то, и RAM-диск вроде не должен хранить данные в физической памяти. В этом плане, решение с memory-mapped files аналогичное. 

Не аналогичное.
Рам диск (нормальный конечно) хранит исключтельно в физической памяти. и никаким образом с диском и файлом не связан. (он даже не свопится, то есть всегда в физ.памяти)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)