Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.27;
Скачать: CL | DM;

Вниз

Потеря памяти при работе с БД   Найти похожие ветки 

 
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&#233;t&#233; G&#233;n&#233;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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.023 c
3-1085756667
Bizons
2004-05-28 19:04
2004.06.27
GEN_ID() в IB6


14-1086633056
YurikGl
2004-06-07 22:30
2004.06.27
Глюки WinXP


1-1087301878
Dysan
2004-06-15 16:17
2004.06.27
глюки исчезающего TChart


4-1084855996
slap
2004-05-18 08:53
2004.06.27
Запуск внешней программы из сервиса


3-1086070603
Valeri
2004-06-01 10:16
2004.06.27
Visual Foxpro, индексы