Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2013, 14:25   #1
Rest_Tremor
Пользователь
 
Регистрация: 05.04.2013
Сообщений: 17
По умолчанию Ошибка "out of memory"

Доброго времени суток, уважаемые форумчане!

Очень надеюсь на вашу помощь! Постараюсь поподробнее описать суть проблемы.
Есть программа, которая работает через СМС-центр и занимается отправкой сообщений абонентам. Написана на TurboDelphi. В общем-то она работает, но проблема в следующем. Пик активности отправок СМС приходится на 3 число каждого месяца с 21 до 22 часов. В это время довольно часто вываливаются ошибки следующего плана: "Thread creation error: недостаточно памяти для обработки команды". Сначала грешили на ошибки в коде самой проги, но ведь она в другое время работает. Облазив кучу форумов, выяснил что такая ошибка вываливается когда "выедается" вся память и оперативная и виртуальная. Пошел по самому простому пути, поставил утилиту-оптимизатор RamRUSH, которая высвобождает оперативу в случае размера ОЗУ 8% от общего объема. Протестили 3 числа, ошибок нет, толька watchdod пару раз ее ребутнул. Вопросы следующие:
1. Может ли быть проблема в железе? В смысле не справляется с нагрузкой(celeron 2 GHz, 256 RAM, файл подкачки 618 Mb)
2. Имеет ли смысл увеличить файл подкачки до 1024 метров?
3. Стоит ли втыкать еще оперативку? (комп используется не как серв, а как рабочая станция)
4. Есть ли добротная утилита, которая в щадящем режиме, безопасно высвобождает оперативу и виртуальную память?
Если нужно ответить на возникающие вопросы - я готов! Спасибо!
Rest_Tremor вне форума Ответить с цитированием
Старый 05.04.2013, 14:36   #2
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Да поставь оперативу гига на 2 и будет тебе счастье.
FaTaL вне форума Ответить с цитированием
Старый 05.04.2013, 15:49   #3
Rest_Tremor
Пользователь
 
Регистрация: 05.04.2013
Сообщений: 17
По умолчанию

Цитата:
Сообщение от FaTaL Посмотреть сообщение
Да поставь оперативу гига на 2 и будет тебе счастье.
Дело в том что оперативка вся не выедается. Может ли быть ошибка в самой проге? Или все-таки это бальное забивание памяти?
Rest_Tremor вне форума Ответить с цитированием
Старый 05.04.2013, 17:53   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Rest_Tremor Посмотреть сообщение
Есть программа, которая работает через СМС-центр и занимается отправкой сообщений абонентам. Написана на TurboDelphi. В общем-то она работает, но проблема в следующем. Пик активности отправок СМС приходится на 3 число каждого месяца с 21 до 22 часов.
Видимо, это время начисления зарплаты или пенсии.
Цитата:
В это время довольно часто вываливаются ошибки следующего плана: "Thread creation error: недостаточно памяти для обработки команды". Сначала грешили на ошибки в коде самой проги, но ведь она в другое время работает.
Прогу можно считать ралбочей, только если она работает всегда. Работа "иногда" о работоспособности не свидетельствует.
Цитата:
Облазив кучу форумов, выяснил что такая ошибка вываливается когда "выедается" вся память и оперативная и виртуальная. Пошел по самому простому пути, поставил утилиту-оптимизатор RamRUSH, которая высвобождает оперативу в случае размера ОЗУ 8% от общего объема. Протестили 3 числа, ошибок нет, толька watchdod пару раз ее ребутнул.
Предварительное замечание:
В свое время писал утилиту, выявляющую зависимость производительности от количества потоков.
Обнаружил интересный эффект:
При создании потоков средствами Delphi проблемы начинаются уже в районе 256 потоков.
При создании потоков средствами WinAPI легко (правда, с некоторой потерей производительности) удавалось создавать по 4096 потоков. Больше - не пробовал.

Это к тому, где следует искать резервы.
Цитата:
Вопросы следующие:
1. Может ли быть проблема в железе? В смысле не справляется с нагрузкой(celeron 2 GHz, 256 RAM, файл подкачки 618 Mb)
...
Указание этих характеристик без указания количества потоков при пиковой нагрузке и количестве выделяемой под каждый поток памяти абсолютно неинформативно.
Можно выдать оценку по ситуации "известен объем работы и известна производительность железа", но невозможно - "объем работы неизвестен, производительность железа известна".
s-andriano вне форума Ответить с цитированием
Старый 05.04.2013, 20:01   #5
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Имеет ли смысл увеличить файл подкачки до 1024 метров?
Файл подкачки имеет смысл увеличить до половины общего размера оперативы. И установить не диапазон, а фиксированный размер.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 05.04.2013, 20:40   #6
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
Файл подкачки имеет смысл увеличить до половины общего размера оперативы.
До половины?
Раньше, вроде, считалось, что должен быть в 3-4 раза больше.
Цитата:
И установить не диапазон, а фиксированный размер.
Ну а фиксированный с точки зрения скорости доступа, конечно, лучше. Хотя, для NTFS, думаю, не очень актуально.
s-andriano вне форума Ответить с цитированием
Старый 05.04.2013, 20:54   #7
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Самый простой способ избежать этого (или по крайней мере запустить больше потоков) уменьшить размер стека в опциях проекта. Ну и естественно слишком уменьшать не стоит, иначе локальные данные не поместятся. И конечно при создании потока надо проверять доступность памяти, если создать поток пока нельзя, то ждём-с.
Но стоит также подумать о простом ограничении количества потоков, иногда многопоточность сильно снижает скорость работы программы (особенно при частых синхронизациях).
eoln вне форума Ответить с цитированием
Старый 05.04.2013, 21:08   #8
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
До половины?
Раньше, вроде, считалось, что должен быть в 3-4 раза больше.
Ну да, ошибся. До полутора размеров оперативы

Однако больше чем 4096 его не выставить
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 08.04.2013, 10:37   #9
Rest_Tremor
Пользователь
 
Регистрация: 05.04.2013
Сообщений: 17
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
Самый простой способ избежать этого (или по крайней мере запустить больше потоков) уменьшить размер стека в опциях проекта.
Подскажите, пожалуйста, как это сделать. Какой выставить размер стека?
Rest_Tremor вне форума Ответить с цитированием
Старый 08.04.2013, 11:29   #10
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

В свойствах проекта, меню Project-Options - там есть что-то в виде Maximum Stack Size (в зависимости от версии IDE). Выставляем там число по-меньше, что позволяет запустить больше потоков.
Но это полумера и от очень большого кол-ва потоков не спасёт, нужно обязательно(!!!) проверять доступность памяти перед создание нового потока, пусть даже тем же самым try... except... end
Какой размер выставить не скажу, это индивидуально для каждого проекта и зависит от размера локальных переменных. Возможно, хватит 300-400 кБ
eoln вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi выдает ошибку "Out of memory" Ol'ga Помощь студентам 5 30.05.2012 14:31
"program too big to fit in memory" си++ nortonys Помощь студентам 12 23.05.2012 16:52
Ошибка "Expecting a valid name" для оператора "<" в JScript Ратибор Редоран JavaScript, Ajax 0 15.12.2011 14:38
Ошибка:является "поле" но используется как "метод" hitman47IT Помощь студентам 0 22.11.2011 20:55
Ошибка при использовании OlePropertyGet("Documents").OleProcedure("Add") в C++ Builder AleksP C++ Builder 7 11.04.2009 13:06