Russian Qt Forum
Ноябрь 24, 2024, 04:03 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Большие блоки памяти  (Прочитано 3769 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Август 31, 2009, 19:12 »

Добрый день

У меня правая рука Mac и левая (довольно хилая Улыбающийся) Вындоуз. Так что я буду говорить только о том что я лично проверял на Mac. Пришлось переделывать несколько старых плагинов, которые использовали такую технику:

- получить размер максимального свободного блока памяти
- распределить этот блок
- внутри него использовать свою кучу (heap)
- по окончанию перераспределить память с помощью realloc (например выделили 500Mb а оказалось что нужно 2Mb)

Такой подход с треском проваливается ввиду:

- не существует больше понятия "максимального свободный блок памяти" - вся память виртуальна и непрерывна

- OS правильно говорит сколько памяти свободно, но попытки выделить блок больше 1Gb возвращают NULL. (в 32-bits и в 64-bits без разницы). Хотя я могу выделить, напрмер, 4 блока по 500Mb. Нашел способ обойти это (vm_allocate) но это глухой нативняк и работать с ним неудобно.

- realloc НЕ работает вообще, блок памяти он обрезает но все равно он недоступен для следующих распределений. После "гугления" узнал что это, мол, стандарт для Darwin систем. Кто там из них Дарвин - для меня без разницы, OSX я держать должен.

Вопрос(ы): пацаны, что слышно на других платформах?
Записан
Winstrol
Гость
« Ответ #1 : Август 31, 2009, 19:40 »

- по окончанию перераспределить память с помощью realloc (например выделили 500Mb а оказалось что нужно 2Mb)
А как достигалается ссылочная целостность? realloc может вернуть указатель на новый блок. Соответственно, все указатели на старый станут невалидыми.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Август 31, 2009, 19:52 »

А как достигалается ссылочная целостность? realloc может вернуть указатель на новый блок. Соответственно, все указатели на старый станут невалидыми.
Я это бы пережил и "целостность" бы подправил  Улыбающийся Дело в том что realloc память не освобождает - как было занято, например, 500Mb  - так и осталось после realloc. Цепочка таких плагинов очень быстро кончается "application ran out of memory"
Записан
Winstrol
Гость
« Ответ #3 : Сентябрь 01, 2009, 12:52 »

А как достигалается ссылочная целостность? realloc может вернуть указатель на новый блок. Соответственно, все указатели на старый станут невалидыми.
Я это бы пережил и "целостность" бы подправил  Улыбающийся Дело в том что realloc память не освобождает - как было занято, например, 500Mb  - так и осталось после realloc. Цепочка таких плагинов очень быстро кончается "application ran out of memory"
Как определить максимальный объем, выделение которого не приведет к out of memory не скажу. Единственное, что сразу приходит в голову - выделить 20 мб, если не хватило, сделать realloc до 40 и.т.д. Но, боюсь, велосипед сей будет работать много тормозней стандартного распределителя.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Сентябрь 01, 2009, 14:48 »

Как определить максимальный объем, выделение которого не приведет к out of memory не скажу.
"Поздно пить Боржоми" - максимального объема уже тоже нет  Улыбающийся
Единственное, что сразу приходит в голову - выделить 20 мб, если не хватило, сделать realloc до 40 и.т.д. Но, боюсь, велосипед сей будет работать много тормозней стандартного распределителя.
Да, пришлось переделывать все на new/malloc и все большие массивы выделять chunk'ами  Показает язык
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 23.