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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QImage: out of memory, returning null image [Решено]  (Прочитано 10396 раз)
Torvald
Самовар
**
Offline Offline

Сообщений: 119


Просмотр профиля
« : Июнь 30, 2017, 14:41 »

Windows 7 x64, приложение скомпилено MinGW 5.3 x32.
Открываю диспетчер задач - смотрю потребление памяти. Оно не превышает 1.5гб в пике, но тем не менее в определенный момент приложение вылетает с ошибкой
QImage: out of memory, returning null image

Приложение - графический редактор, само изображение имеет размер 6000х4000
« Последнее редактирование: Июнь 30, 2017, 15:14 от Torvald » Записан
Apktyc
Самовар
**
Offline Offline

Сообщений: 133


Просмотр профиля
« Ответ #1 : Июнь 30, 2017, 15:09 »

Используйте для сборки
Код
C++ (Qt)
QMAKE_LFLAGS += -Wl,--large-address-aware
Это слегка отсрочит окончание памяти.

А так, наверное нужен свой алокатор.
Записан
Torvald
Самовар
**
Offline Offline

Сообщений: 119


Просмотр профиля
« Ответ #2 : Июнь 30, 2017, 15:13 »

Спасибо, еще я кажется понял одну вещь.
Для 32-битного приложение ограничение статической памяти и динамической - по 2 гигабайта, то есть всего 4. Изображения, естественно, находятся в динамической памяти.
Диспетчер задач не позволяет просмотреть пик потребления памяти, например при вычислениях, потребление памяти может на доли секунды возрастать на несколько сотен мегабайт. Отсюда и вылеты.
Записан
Apktyc
Самовар
**
Offline Offline

Сообщений: 133


Просмотр профиля
« Ответ #3 : Июнь 30, 2017, 15:47 »

Для 32-битного приложение ограничение статической памяти и динамической - по 2 гигабайта, то есть всего 4.

Ну, стек на 2 ГБ - это вы конечно круто замахнулись  Смеющийся По-умолчанию он наверное мегабайта 2.
А вот чтобы адресовать в куче (для х86) сверх 2 ГБ и нужны флаги выше.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #4 : Июнь 30, 2017, 15:49 »

QImage не позволяет хранить очень большие изображения, вот тут https://github.com/qt/qtbase/blob/dev/src/gui/image/qimage.cpp#L130 проверка на то, что оно влезет. Лень высчитывать, влезет ли ваше изображение.
Записан
Torvald
Самовар
**
Offline Offline

Сообщений: 119


Просмотр профиля
« Ответ #5 : Июнь 30, 2017, 15:51 »

да да, влезает. Еслиб не влезало - упало бы сразу.
Записан
Apktyc
Самовар
**
Offline Offline

Сообщений: 133


Просмотр профиля
« Ответ #6 : Июнь 30, 2017, 16:00 »

Ограничение QImage 32767x32767
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Июнь 30, 2017, 16:01 »

само изображение имеет размер 6000х4000
Ну это всего лишь 96 Мb, до полутора гектаров еще далеко. А вообще некоторые ОС не выделяют слишком большие куски (> 1 Gb) даже если эта память имеется и даже в 64-бит
Записан
Torvald
Самовар
**
Offline Offline

Сообщений: 119


Просмотр профиля
« Ответ #8 : Июнь 30, 2017, 16:09 »

96 мб, да, но это графический редактор, там еще  полно всякого - для оптимизации создается много дополнительных буферов с промежуточными вычислениями размером с оригинальное изображение. Для аналогии могу привести лайтрум - там, одно только открытие подобного изображения, увеличивает потребление памяти на 800мб. Но в лайтруме, конечно, свой менеджер памяти, это я так, для сравнения.
Записан
Apktyc
Самовар
**
Offline Offline

Сообщений: 133


Просмотр профиля
« Ответ #9 : Июнь 30, 2017, 16:15 »

Проблема что это 96 МБ одним куском. Так что, увеличение кучи лишь отсрочка.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Июль 01, 2017, 11:24 »

96 мб, да, но это графический редактор, там еще  полно всякого - для оптимизации создается много дополнительных буферов с промежуточными вычислениями размером с оригинальное изображение. Для аналогии могу привести лайтрум - там, одно только открытие подобного изображения, увеличивает потребление памяти на 800мб. Но в лайтруме, конечно, свой менеджер памяти, это я так, для сравнения.
Разбазаривание памяти (и ресурсов вообще) - чисто проблема программиста. Придется пересмотреть подход (и это правильно).

Проблема что это 96 МБ одним куском. Так что, увеличение кучи лишь отсрочка.
Такие блоки выделялись без проблем еще на древнем XP
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #11 : Июль 01, 2017, 12:11 »

А вообще некоторые ОС не выделяют слишком большие куски (> 1 Gb) даже если эта память имеется и даже в 64-бит
Неужели. Сможете назвать хоть одну?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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