Очень огромное изображение обрабатывается 5 раз. Каждый раз вызывается обработчик AddNoiseHandler::startHandler(), где используется одно и тоже исходное изображение. Результат добавляется в стек. После 4-го раза приложение занимает за 1000 мб оперативной памяти. На 5-ом вылет происходит в строке: uchar* line = result->scanLine(i);
void AddNoiseHandler::startHandler() < // Добавление шума // Формула: C’ = C + (Noise * 255 — 127) // C’- новый цвет // C — старый цвет try < emit setStatus(2); emit setPercent(0); std::shared_ptrintelligent_picture(new QImage(*source)); if (intelligent_picture->isNull()) < throw new OutOfMemoryException(); >result = intelligent_picture; register int level = levelNoise; register int step = result->height() / 100; register int width = result->width() * 4; register int height = result->height(); QMessageBox msg; for (int i = 0; i < height; ++i) < // При недостатке ОП здесь вылет uchar* line = result->scanLine(i); // r, g, b, a for (int j = 0; j < width; j += 4) < register int r = line[j]; // Red register int g = line[j + 1]; // Green register int b = line[j + 2]; // Blue r = r + (int)(level * 255.0 / 100.0 — 127.0); r >255? r = 255 : 0; r < 0? r = 0 : 0; g = g + (int)(level * 255.0 / 100.0 — 127.0); g >255? g = 255 : 0; g < 0? g = 0 : 0; b = b + (int)(level * 255.0 / 100.0 — 127.0); b >255? b = 255 : 0; b < 0? b = 0 : 0; line[j] = r; line[j + 1] = g; line[j + 2] = b; >if (i % step == 0) < emit setPercent(i / step); >> emit setPercent(100); emit setStatus(5); > catch (OutOfMemoryException* error) < emit setStatus(3); emit sendError(error); >>
Как предотвратить вылет?
Отслеживать
задан 19 июл 2014 в 21:25
Vadym Demchuk Vadym Demchuk
332 2 2 серебряных знака 14 14 бронзовых знаков
Недостаточно памяти для продолжения выполнения программы
Стойте, вы говорите, что результаты добавляются в стек? То есть, у вас в памяти должно оказаться 5 немного изменённых копий очень огромного изображения?
Ну тогда памяти и правда может не хватить, что ж вы думали. Не храните все 5 копий изображения в памяти, делов-то! Храните только те, которые вам нужны.
19 июл 2014 в 21:52
а насколько «очень громное изображение»?
19 июл 2014 в 21:54
нужно хранить все изображения, а при недостатке памяти выдать сообщение. Утечки памяти нет. Использую shared_ptr. При обычном изображении работает нормально. Но когда берется изображение 8192×5460 на жестком диске занимает 50 мб.
В оперативной памяти в обёртке QImage 170 мб. Таким образом, во время выполнения имеется 2 одинаковых исходных изображений (так нужно, никак не изменить), и за каждую обработку появляется новое, но с разным шумом. Таких я могу сделать 4 шт. Считаем: 20мб само приложение + (2 + 4) * 170 мб = 1040 мб. При следующей обработке вылет. Предел по количеству изображений 20 ш
19 июл 2014 в 22:31
19 июл 2014 в 23:08
19 июл 2014 в 23:14
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Я думаю, проблема на самом деле в implicit data sharing. Вы не делаете настоящую копию картинки, внутри у картинки указатель на общие данные с оригиналом. При первой попытке доступа к пикселям ( scanLine() ) происходит попытка клонирования данных, которая и падает из-за нехватки памяти.
РЕШЕНИЕ ПРОБЛЕМЫ «В системе недостаточно памяти»
Вам нужно вызывать конструктор, который проверяют размер самостоятельно, а не пользуется (удобным) неявным копированием. Например, создайте «чистую» картинку нужного размера при помощи QImage::create() и скопируйте в неё данные из картинки-оригинала через bits() и (например) memcpy . Или при помощи конструктора с размером и проверьте результат на isNull .
Update: На самом деле вам не надо самому создавать данные, доверьтесь конструктору QImage . Например, что-то такое должно сработать:
std::shared_ptr intelligent_picture(new QImage(width, height, format)); if (intelligent_picture->isNull()) < // значит, памяти не хватило, ругаемся и выходим >// если мы тут, памяти хватает // копируем данные uchar* dataSrc = this->source->bits(); uchar* dataDst = intelligent_picture->bits(); memcpy(dataDst, dataSrc, length * sizeof(uchar));
Обошлись без исключений.
Источник: ru.stackoverflow.com
Недостаточно памяти для выполнения программы
При нажатии на кнопку, к которой привязанно открытие формы выдаётся сообщение «недостаточно памяти для выполнения операции. закройте другие приложения и повторите операцию» А другие открытия форм действуют правильно . Приложения закрывал, перегружался , пробовал на другом компе всё равно выдаёт это сообщение!
Подскажите что сделать ?
Движение — жизнь. Остановка — . ?
Регистрация: 31.07.2008
Сообщений: 3
Privet v accesse esti obzia
arhivirovati i remontirovati
pomoemu ona tak nazivaetsya
Пользователь
Регистрация: 13.05.2009
Сообщений: 37
Тут вероятно дело в том что у тебя эта форма пытается отобразить очень большой набор данных сразу. Попробуй задать условие отбора какое-нибудь чтобы записей меньше загружалось. А arhivirovati i remontirovati в аксесе называется «Сжать и восстановить» в меню Сервис, тоже может помочь
C++ Builder 6
Регистрация: 31.07.2008
Сообщений: 3
x8i
sposibo za perevod
[]
Форумчанин
Регистрация: 12.08.2009
Сообщений: 197
У меня сегодня тоже перестала запускаться! Пишет тоже самое! Как еще можно это исправить? Вот база которая не запускается : Журнал услуг.rar
Форумчанин
Регистрация: 26.04.2008
Сообщений: 487
база работает. Форма «num» открывается.
Форумчанин
Регистрация: 12.08.2009
Сообщений: 197
база работает.
Форма «num» открывается.
А у меня выскакивают следующие ошибки — 1.jpg 2.jpg
Не подскажите что может быть?
Пользователь
Регистрация: 21.03.2009
Сообщений: 52
если мне не изменяет память, то в моём случае это был глюк с самой формой, вероятно тоже и у тебя с формой NUM, мой совет попробуй создать её заново. И проверить работоспособность без подключения макроса
Ещё одно какая версия ACCESS ?
Движение — жизнь. Остановка — . ?
Форумчанин
Регистрация: 12.08.2009
Сообщений: 197
если мне не изменяет память, то в моём случае это был глюк с самой формой, вероятно тоже и у тебя с формой NUM, мой совет попробуй создать её заново. И проверить работоспособность без подключения макроса
Ещё одно какая версия ACCESS ?
Microsoft Access 2003! Макросы удалил но всеравно не хочет!Я ее сегодня редактировал пол дня и сначала она работала а потом перестала!
Пользователь
Регистрация: 21.03.2009
Сообщений: 52
как создавал макрос на автозапуск формы , вручную или через параметры загрузки ?
Движение — жизнь. Остановка — . ?
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Массив TBitmap, «Недостаточно памяти для обработки команды» | Роман Радер | Мультимедиа в Delphi | 5 | 05.04.2009 18:14 |
недостаточно оперативной памяти для отображения информации | VVlad69 | Microsoft Office Access | 02.04.2009 14:51 | |
Нехватка памяти | Корчеватель | Общие вопросы Delphi | 17.10.2008 19:03 | |
Место в памяти. | Манжосов Денис 🙂 | Помощь студентам | 3 | 24.09.2008 15:35 |
Thread creation error — Недостаточно памяти | RealSwift | Общие вопросы Delphi | 1 | 06.07.2008 12:27 |
Источник: www.programmersforum.ru
Исправлена ошибка нехватки памяти при копировании файлов в Windows 10
Ошибка
Жесткий диск и оперативная память играют важную роль в выполнении любых операций на компьютере. Каждая задача или процесс, происходящий в компьютере, требует некоторого объема оперативной памяти, а также жесткого диска для выполнения. Но иногда, когда вы копируете файлы из одного места в другое, вы можете получить одно из следующих сообщений:
- Недостаточно памяти или системных ресурсов. Закройте некоторые окна или программы и повторите попытку.
- Недостаточно памяти для выполнения этой операции – копирования файлов.
Эта ошибка возникает из-за ограничения кучи рабочего стола , когда недостаточно памяти для выполнения этой операции при копировании файлов. Сегодня мы рассмотрим возможные исправления для увеличения этого предела и, в конечном счете, исправим эту ошибку в Windows 10.
Ну, закройте все открытые окна и программы и попробуйте скопировать снова и посмотреть, поможет ли это. Если это не так, следуйте нашему предложению.
Ошибка нехватки памяти при копировании файлов
Прежде чем начать, вы можете сначала создать точку восстановления системы, поскольку это может помочь вам отменить нежелательные или нежелательные изменения.