Виртуальная память |
Здравствуйте, гость ( Вход | Регистрация )
Виртуальная память |
chereppiter |
21.11.2012, 14:26
Сообщение
#1
|
Студент Группа: Участник Сообщений: 30 Регистрация: 12.11.2012 Пользователь №: 3595 Спасибо сказали: 0 раз(а) Репутация: 0 |
Народ, в Qt есть какие-нибудь функции/классы для работы с виртуальной памятью? Что-нибудь наподобие VirtualAlloc в Win32 API. Есть необходимость выделять в программе большие объёмы памяти, теоретически до нескольких гигабайт.
|
|
|
Litkevich Yuriy |
21.11.2012, 22:18
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Есть файлы отображаемые в память. Подойдут?
|
|
|
chereppiter |
23.11.2012, 13:05
Сообщение
#3
|
Студент Группа: Участник Сообщений: 30 Регистрация: 12.11.2012 Пользователь №: 3595 Спасибо сказали: 0 раз(а) Репутация: 0 |
Эммм... Не знаю, подойдут или нет - не доводилось ещё их использовать. На самом деле проблема в следующем: в программе нужно временно хранить большие объёмы данных, причём сами данные постоянно меняются (одни данные устарели, на их место можно записать новые). В принципе, можно было бы воспользоваться QTemporaryFile и хранить данные во временных файлах, но есть опасения, что постоянные операции чтения-записи на жёсткий диск сильно замедлят работу приложения, а оно критично к скорости. Поэтому и хотелось воспользоваться каким-то механизмом типа виртуальной памяти, чтобы основная масса операций всё-таки происходила в оперативной памяти и лишь при необходимости использовался жёсткий диск. А как тут использовать отображаемые в память файлы, мне не совсем понятно. Насколько я понимаю, файл должен уже существовать перед началом его отображения. Ну или его можно сначала создать, но он же должен иметь максимально возможный размер? А хотелось бы, чтобы он увеличивался или уменьшался по мере необходимости.
|
|
|
Iron Bug |
23.11.2012, 15:36
Сообщение
#4
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
Не знаю, как именно это реализовано в Qt, но под вендой, например, работа с файлами с отображением в память оптимизируется через задание смещения начала и размера отображаемого участка, если требуется читать не весь файл. А временные файлы через API венды вообще создаются в памяти и только при нехватке памяти кэшируются в
своп. Я работала с многогигабайтными файлами изображений через API - вполне сносная скорость была. А самые быстрые кроссплатформенные функции работы с файлами - в СRT: fopen, fread, fwrite, fseek. Они просто раз в десять шустрее всех потоковых C++-ных наворотов. Если нужно много скакать по файлу c чтением и записью, то лучше их заюзать. И установить размер буфера через setvbuf. |
|
|
qt_user |
23.12.2012, 19:24
Сообщение
#5
|
Студент Группа: Участник Сообщений: 52 Регистрация: 11.9.2012 Пользователь №: 3518 Спасибо сказали: 0 раз(а) Репутация: 0 |
виртуальная память не хранится в ОЗУ. Виртуальные страницы подружаются при необходимости.
У тебя программа загружается без инициализации этих данных? Если да, то в момент выполнения программы делай new. Испытай кучу. А ваще просто проектирование ПО дало сбой видимо. Несколько Гб в ОЗУ, так никто не делает. |
|
|
Текстовая версия | Сейчас: 1.12.2024, 11:55 |