Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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&#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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.04 c
14-1086406358
VolanD
2004-06-05 07:32
2004.06.27
Два вопроса по информатике.


8-1081487287
HydraMarat
2004-04-09 09:08
2004.06.27
Сглаживание иконок а-ля WinXP


3-1086048729
Equillibrium
2004-06-01 04:12
2004.06.27
Какая Макс длина поля со строкой в таблице db


14-1086465332
KilkennyCat
2004-06-05 23:55
2004.06.27
Почему я отказался от значка.


3-1086111654
Dmitry Vyacheslavovich
2004-06-01 21:40
2004.06.27
Like - Containing





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский