Форум: "Базы";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];
ВнизПотеря памяти при работе с БД Найти похожие ветки
← →
Tormoz (2004-05-27 13:19) [0]Уважаемые Мастера!
Пока работал на курсовой работой столкнулся с интересной особенностью:
Программа работает через BDE с БД(Paradox), есть несколько форм, пяток DataModules, ну и прочее:
все компоненты стандартные, родные.
Но вот, блин, незадача: программа оставляет за собой т а к и е "хвосты" в памяти после своего завершения,
что в конечном итоге (если запустить ее несколько раз, например,10), можно почитать следующее сообщение на экране:
"Out of resources" или вообще, на белой простыне от windows: "Системе существенно не хватает ресурсов...".
Что за грабли такие?
Все Datasetы перед завершением программы закрываю, с динамической памятью не работаю,формы, модули данных, и те, создаю и уничтожаю программно...
Но Системный Монитор стабильно показывает уменьшение Свободной физической пямяти.
Посоветуйте, если Кто чего знает, Заранее благодарю за внимание и помощь!
← →
Tormoz (2004-05-27 18:02) [1]Алле !!!
Никто не сталкивался с такой проблемой ?
← →
Desdechado © (2004-05-27 21:01) [2]Если ты так уверен, что корректно освобождаешь память, то, видимо, проблем быть не должно. Но они есть, значит, что-то ты прозевал. Ищи.
БДЕ отлаживался много лет, дырки там мне неизвестны, а я его мучил долго.
← →
Nikolay M. © (2004-05-27 21:58) [3]Закрытием программу через Ctrl+F2 не грешен?
← →
Digitman © (2004-05-28 09:24) [4]действительно, если неоднократно и некорректно завершать сеанс работы с БДЕ, то через некоторое время очередная попытка стартовать БДЕ-сеанс вернет отказ с диагностикой нехватки сист.ресурсов при иниц-ции БДЕ
← →
Tormoz (2004-05-31 11:18) [5]To Digitman
"если неоднократно и некорректно завершать сеанс работы с БДЕ..."
Закрываю ВСЕ датасеты, Database.Connected:=false;
Может чего еще надо?
Уже дошел до того, что после закрытия Датасетов убиваю их...
Все равно: 5-7 КВ "схаваны".
И что такое "некорректно"? Можно обрисовать типичную ситуацию?
To Nikolay M.
В том то и дело, что память "хавает" EXEшник!!!
← →
Digitman © (2004-05-31 11:43) [6]
> Tormoz
ты вообще-то уверен, что закрытие твоего приложения (наблюдаемое визуально) однозначно приводит к завершению работы его процесса ?
после нескольких сеансов запуска/завершения программы в TaskManager"е не наблюдается ли более чем один экз-р процесса твоего приложения ?
← →
Tormoz (2004-05-31 13:07) [7]Попробовал TaskManager: грабли не показывает.
← →
Digitman © (2004-05-31 13:15) [8]без кода сложно что-либо определенное сказать
← →
Tormoz (2004-05-31 15:24) [9]To Digitman
Хорошо, тогда я вот что предлагаю. В принципе, я добился значительно меньших потерь памяти за счет уничтожения объектов at runtime. Попробуй ,если не сложно, проверить "на память" системным монитором работу какой-нибудь своей BDE-based EXEшник. Может, что-то подобное будет наблюдаться?
Я попробовал посмотреть как работает Winword и прочие брэндовые изделия: этот "товарищ" сколько взял памяти, столько и вернул.
Буду очень признателен, если поделишся результатами.
Еще я заметил следующее: чем объемнее/сложнее проект, тем больше потери.
← →
Digitman © (2004-05-31 17:49) [10]
> Еще я заметил следующее: чем объемнее/сложнее проект, тем
> больше потери.
нет... просто 17-я строка , та самая - с ключевой ошибкой, в более объемном/сложном проекте гораздо менее заметна, нежели в тощем/простом
← →
Tormoz (2004-06-01 13:04) [11]To Digitman
:)))
И все-таки, "Попробуй ,если не сложно, проверить "на память" ..."
← →
Кщд © (2004-06-01 13:35) [12]Tormoz
датасеты создаются динамически?
код?
← →
Tormoz (2004-06-01 13:56) [13]To Кщд
"датасеты создаются динамически?" - пусть нет, что тогда ?
"код?" - какой именно фрагмент?
← →
Кщд © (2004-06-01 15:02) [14]Tormoz (01.06.04 13:56) [13]
если создание в ран-тайм, то - код, в котором создаются, + как освобождаете.
← →
Tormoz (2004-06-01 17:59) [15]To Кщд © (01.06.04 15:02) [14]
Так можно, если даже датасеты создаются at design time?
...
// Destroy all DataSets
ProgDB.CloseDataSets; // ProgDB=class(TDataBase);
ProgDB.Connected:=false;
K:=0;
For i:=0 to (Application.ComponentCount-1) Do
begin
if ((Application.Components[i] is TDataModule))
then
begin
j:=0;
While j<=(Application.Components[i] as TDataModule).ComponentCount-1 Do
begin
if ((Application.Components[i] as TDataModule).Components[j] is TDataSet)
then
begin
((Application.Components[i] as TDataModule).Components[j] as TDataSet).Free;
K:=K+1;
end
else j:=j+1;
end;
end;
end;
showmessage("Was destroyed "+inttostr(k)+" Datasets");
У меня этот фрагмент дает меньшие потери памяти после завершения программы...
← →
Кщд © (2004-06-02 05:43) [16]1. TDatabase.DataSets
2. при создании в дизайн-тайм, либо при грамотном создании в ран-тайм - об уничтожении позаботится owner. вместо вашей процедуры - посмотрите на 1. и закройте все ассоциированные с ProgDB датасеты.
← →
Tormoz (2004-06-02 09:20) [17]To Кщд © (02.06.04 05:43) [16]
Абсолютно согласен, но "этот фрагмент дает меньшие потери памяти после завершения программы...". Бред какой-то.Причем, кажется, мой :(
И еще итересный момент: при завершении программы, аналогичным образом уничтожаю все формы - опять же, потери памяти становятся меньше.
← →
ЮЮ © (2004-06-03 02:52) [18]"Out of resources" = это, IMHO, нехватка ресурсов (чаще всего GDI в Win95,Win98), а не памяти. Посмотри сколько ресурсов до запуска твоей проги и сколько после. Поэтому их зачастую и не хватает при запуске (ну нету столько!). Расточительным компонентом в Delphi является DBGrid (бросай в Дизайне на форму ДВГриды и наблюдай, как утекают GDI-ресурсы), а их, полагаю, при "пяток DataModules" на формах немерянно. Поэтому методы борьбы лежат несколько не там, не с DataSet-ами "бороться" надо, а экономить ресурсы Windows.
← →
Sergey13 © (2004-06-03 09:13) [19]2ЮЮ © (03.06.04 02:52) [18]
Точно.
>Расточительным компонентом в Delphi является DBGrid
А популярный (потому что хороший 8-) DBGridEh (в ранних версиях по крайней мере при работе на В98, щас не знаю, ибо перешел на В2000) уж совсем расточительный. У меня помнится некоторые гриды по 3-4% GDI сжирали. Особенно, помнится, если сильно выеживаться с их титлами (объединения колонок, кнопки и т.п.).
← →
Tormoz (2004-06-03 11:11) [20]To ЮЮ
"Посмотри сколько ресурсов до запуска твоей проги и сколько после".
Извини полного Tormoz"a: а как это можно "посмотреть"?
← →
DenK_vrtz © (2004-06-03 11:21) [21]>а как это можно "посмотреть"?
Если 98 винда то открыть, например, Калькулятор\Меню\О программе
← →
Sergey13 © (2004-06-03 11:42) [22]2Tormoz (03.06.04 11:11) [20]
В нортоновских утилитах помнится есть прекрасный монитор.
← →
ЮЮ © (2004-06-03 12:15) [23]Поищи в Инете какой нибудь Resource Meter
← →
NikB (2004-06-03 12:48) [24]К сожалению я не все написано здесь прочитал :), но советаю пользовать:
MemCheck: the ultimate memory troubles hunter
Created by: Jean Marc Eber & Vincent Mahon, Société Générale, INFI/SGOP/R&D
Version 2.58 -> Also update OutputFileHeader when changing the version #
Contact...
Vincent.Mahon@free.fr
http://v.mahon.free.fr/pro/freeware/memcheck
С нем, когда есть ДебугИнфо, можно легко увидеть сколько и где теряется память. Ест и другие срадства отладки: MemProof i т.д.
Если будут проблемьи с downlod - е-майл мне :)
Желаю удачи
← →
Jiny (2004-06-03 16:49) [25]Сейчас работаю на корпоративной программой через Interbase Server 6.0. Сервак находится на моем компе, таблиц - около 40, форм - около 120, при работе сразу с несколькими формами тоже возникают проблемы с памятью, приходиться перезагружаться(это в среде разработки), но когда запускаю скомпилинный проект, то смотрю через Мой компьютер->свойства, память жрет на весь проект максимум 10%(это при практически полной загрузке), и после закрытия проги все возвращается обратно как и до запуска.
Помимо освобождения объектов и массивов, нужно в событии OnClose формы писать :
Action:=caFree;
FrmMain:=nil; //где FrmMain - форма, которую закрываешь.
Может поможет :)
← →
Tormoz (2004-06-03 17:25) [26]to All
Спасибо Всем большое, буду пробовать, если чего нарою интересного - обозначу!
Уважаемые! Посоветуйте действительно хорошую литературу по использованию Interbase из под Delphi.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.04 c