| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 |
ага, верное направление! |
| Автор: o2n3e 19.10.2013, 07:48 |
Модератор: Сообщение скрыто. |
| Автор: volatile 19.10.2013, 10:56 |
Можно подумать в венде этого нет. Этот способ будет точно также работать и в венде, как и в никсе, только это ламерский способ. Вполне может получиться так, что при следующем обращении к файлу, он уже будет благополучно замещен в кеше другим. Потому-что попадание зависит от параметров кеширования, от частоты обращения к этому файлу, от частоты обращений к диску других приложений (одним словом от фазы луны). Лучше уж вы бы как раньше, просто "учили жить" без конкретики, за умного может бы сошли ... |
| Автор: 12usver12 19.10.2013, 13:33 |
| volatile +1 если учесть что и оперативки не так уж и много, кто ж его будет кэшить то постоянно |
| Автор: akizelokro 19.10.2013, 23:23 |
| memory-mapped files |
| Автор: feodorv 19.10.2013, 23:55 |
Возможно, эта "внешняя консольная программа" уже пользуется mmap'ом, возможно, что и нет (и не понятно, есть ли возможность переписать её под mmap). Для нескольких потоков это не плохой вариант (понятно, что даже при этом файл не будет постоянно в оперативной памяти). Но если программа сильно "внешняя", приходится искать другие пути. Ramdisk сожрёт часть оперативной памяти, могут начаться проблемы с производительностью ОС. Наряду с ramdisk'ом было бы недурно доставить памяти... |
| Автор: volatile 20.10.2013, 10:22 |
Это не влияет на кеширование. При открытии он не считывается в кеш. При долгом не обращении (при активной работе других приложений с диском), уходит из кеша. В общем ничем практически не отличается от обычных read() write() в плане кешированя. |
| Автор: GremlinProg 20.10.2013, 21:04 | ||||
Вобщем-то, и RAM-диск вроде не должен хранить данные в физической памяти. В этом плане, решение с memory-mapped files аналогичное. Но, учитывая:иRAM-диск все же логичнее. |
| Автор: volatile 20.10.2013, 21:38 | ||
Не аналогичное. Рам диск (нормальный конечно) хранит исключтельно в физической памяти. и никаким образом с диском и файлом не связан. (он даже не свопится, то есть всегда в физ.памяти) |