|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
05.04.2013, 14:25 | #1 |
Пользователь
Регистрация: 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. Есть ли добротная утилита, которая в щадящем режиме, безопасно высвобождает оперативу и виртуальную память? Если нужно ответить на возникающие вопросы - я готов! Спасибо! |
05.04.2013, 14:36 | #2 |
Участник клуба
Регистрация: 09.11.2007
Сообщений: 1,761
|
Да поставь оперативу гига на 2 и будет тебе счастье.
|
05.04.2013, 15:49 | #3 |
Пользователь
Регистрация: 05.04.2013
Сообщений: 17
|
|
05.04.2013, 17:53 | #4 | ||||
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
Цитата:
Цитата:
Цитата:
В свое время писал утилиту, выявляющую зависимость производительности от количества потоков. Обнаружил интересный эффект: При создании потоков средствами Delphi проблемы начинаются уже в районе 256 потоков. При создании потоков средствами WinAPI легко (правда, с некоторой потерей производительности) удавалось создавать по 4096 потоков. Больше - не пробовал. Это к тому, где следует искать резервы. Цитата:
Можно выдать оценку по ситуации "известен объем работы и известна производительность железа", но невозможно - "объем работы неизвестен, производительность железа известна". |
||||
05.04.2013, 20:01 | #5 | |
Старожил
Регистрация: 16.05.2012
Сообщений: 3,211
|
Цитата:
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
|
|
05.04.2013, 20:40 | #6 | |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
До половины?
Раньше, вроде, считалось, что должен быть в 3-4 раза больше. Цитата:
|
|
05.04.2013, 20:54 | #7 |
Старожил
Регистрация: 26.04.2008
Сообщений: 2,645
|
Самый простой способ избежать этого (или по крайней мере запустить больше потоков) уменьшить размер стека в опциях проекта. Ну и естественно слишком уменьшать не стоит, иначе локальные данные не поместятся. И конечно при создании потока надо проверять доступность памяти, если создать поток пока нельзя, то ждём-с.
Но стоит также подумать о простом ограничении количества потоков, иногда многопоточность сильно снижает скорость работы программы (особенно при частых синхронизациях). |
05.04.2013, 21:08 | #8 | |
Старожил
Регистрация: 16.05.2012
Сообщений: 3,211
|
Цитата:
Однако больше чем 4096 его не выставить
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
|
|
08.04.2013, 10:37 | #9 |
Пользователь
Регистрация: 05.04.2013
Сообщений: 17
|
|
08.04.2013, 11:29 | #10 |
Старожил
Регистрация: 26.04.2008
Сообщений: 2,645
|
В свойствах проекта, меню Project-Options - там есть что-то в виде Maximum Stack Size (в зависимости от версии IDE). Выставляем там число по-меньше, что позволяет запустить больше потоков.
Но это полумера и от очень большого кол-ва потоков не спасёт, нужно обязательно(!!!) проверять доступность памяти перед создание нового потока, пусть даже тем же самым try... except... end Какой размер выставить не скажу, это индивидуально для каждого проекта и зависит от размера локальных переменных. Возможно, хватит 300-400 кБ |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |