Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Torvald от Июнь 30, 2017, 14:41



Название: QImage: out of memory, returning null image [Решено]
Отправлено: Torvald от Июнь 30, 2017, 14:41
Windows 7 x64, приложение скомпилено MinGW 5.3 x32.
Открываю диспетчер задач - смотрю потребление памяти. Оно не превышает 1.5гб в пике, но тем не менее в определенный момент приложение вылетает с ошибкой
QImage: out of memory, returning null image

Приложение - графический редактор, само изображение имеет размер 6000х4000


Название: Re: QImage: out of memory, returning null image
Отправлено: Apktyc от Июнь 30, 2017, 15:09
Используйте для сборки
Код
C++ (Qt)
QMAKE_LFLAGS += -Wl,--large-address-aware
Это слегка отсрочит окончание памяти.

А так, наверное нужен свой алокатор.


Название: Re: QImage: out of memory, returning null image
Отправлено: Torvald от Июнь 30, 2017, 15:13
Спасибо, еще я кажется понял одну вещь.
Для 32-битного приложение ограничение статической памяти и динамической - по 2 гигабайта, то есть всего 4. Изображения, естественно, находятся в динамической памяти.
Диспетчер задач не позволяет просмотреть пик потребления памяти, например при вычислениях, потребление памяти может на доли секунды возрастать на несколько сотен мегабайт. Отсюда и вылеты.


Название: Re: QImage: out of memory, returning null image
Отправлено: Apktyc от Июнь 30, 2017, 15:47
Для 32-битного приложение ограничение статической памяти и динамической - по 2 гигабайта, то есть всего 4.

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


Название: Re: QImage: out of memory, returning null image [Решено]
Отправлено: Авварон от Июнь 30, 2017, 15:49
QImage не позволяет хранить очень большие изображения, вот тут https://github.com/qt/qtbase/blob/dev/src/gui/image/qimage.cpp#L130 проверка на то, что оно влезет. Лень высчитывать, влезет ли ваше изображение.


Название: Re: QImage: out of memory, returning null image [Решено]
Отправлено: Torvald от Июнь 30, 2017, 15:51
да да, влезает. Еслиб не влезало - упало бы сразу.


Название: Re: QImage: out of memory, returning null image [Решено]
Отправлено: Apktyc от Июнь 30, 2017, 16:00
Ограничение QImage 32767x32767


Название: Re: QImage: out of memory, returning null image [Решено]
Отправлено: Igors от Июнь 30, 2017, 16:01
само изображение имеет размер 6000х4000
Ну это всего лишь 96 Мb, до полутора гектаров еще далеко. А вообще некоторые ОС не выделяют слишком большие куски (> 1 Gb) даже если эта память имеется и даже в 64-бит


Название: Re: QImage: out of memory, returning null image [Решено]
Отправлено: Torvald от Июнь 30, 2017, 16:09
96 мб, да, но это графический редактор, там еще  полно всякого - для оптимизации создается много дополнительных буферов с промежуточными вычислениями размером с оригинальное изображение. Для аналогии могу привести лайтрум - там, одно только открытие подобного изображения, увеличивает потребление памяти на 800мб. Но в лайтруме, конечно, свой менеджер памяти, это я так, для сравнения.


Название: Re: QImage: out of memory, returning null image [Решено]
Отправлено: Apktyc от Июнь 30, 2017, 16:15
Проблема что это 96 МБ одним куском. Так что, увеличение кучи лишь отсрочка.


Название: Re: QImage: out of memory, returning null image [Решено]
Отправлено: Igors от Июль 01, 2017, 11:24
96 мб, да, но это графический редактор, там еще  полно всякого - для оптимизации создается много дополнительных буферов с промежуточными вычислениями размером с оригинальное изображение. Для аналогии могу привести лайтрум - там, одно только открытие подобного изображения, увеличивает потребление памяти на 800мб. Но в лайтруме, конечно, свой менеджер памяти, это я так, для сравнения.
Разбазаривание памяти (и ресурсов вообще) - чисто проблема программиста. Придется пересмотреть подход (и это правильно).

Проблема что это 96 МБ одним куском. Так что, увеличение кучи лишь отсрочка.
Такие блоки выделялись без проблем еще на древнем XP


Название: Re: QImage: out of memory, returning null image [Решено]
Отправлено: Old от Июль 01, 2017, 12:11
А вообще некоторые ОС не выделяют слишком большие куски (> 1 Gb) даже если эта память имеется и даже в 64-бит
Неужели. Сможете назвать хоть одну?