Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2010.02.28;
Скачать: [xml.tar.bz2];

Вниз

TClientDataSet и освобождение памяти   Найти похожие ветки 

 
Jungle   (2009-03-31 12:06) [0]

Заметил такое поведение TClientDataSet: когда его очищаешь, память не освобождается.
Смотрел с помощью ProcessExplorer v11.21 (Sysinternals), а также при помощи FastMM (Fast Memory Manager v4.92).

В ProcessExplorer"е наглядно видно как при добавлении записей потребляемая память растёт, а при очистке не убывает. FastMM пишет при завершении приложения об утечках памяти - Unknown x N, где N - число записей в ClientDataSet.

Причём, если ClientDataSet.LogChanges = false, то память не очищается вовсе, а если true, то чего-то очищается, но не до исходного состояния.

Если заполнять (устанавливать длину) и очищать динамический массив, то память нормально увеличивается и уменьшается.

Такое поведение нормально? И если нет, то возможно ли побороть?


 
Сергей М. ©   (2009-03-31 12:13) [1]


> Если заполнять (устанавливать длину) и очищать динамический
> массив


Какая длина ?
Какого массива ?


 
Jungle   (2009-03-31 12:30) [2]


> Какая длина ?
> Какого массива ?


Объявляю массив
var ar : array of integer;

Потом в программе задаю длину (по нажатию кнопки)
SetLength(ar, 250000);

При выполнении этого действия в ProcessExplorer"е видно, что используемая память увеличилась на 1Мб

Потом меняю длину (тоже по нажатию кнопки)
SetLength(ar, 0);

При выполнении этого действия в ProcessExplorer"е видно, что используемая память уменьшилась на 1Мб.


 
Сергей М. ©   (2009-03-31 12:48) [3]

А TClientDataset-то тут причем ?

Ты чего-то там шебуршишься с какими-то массивами, а "виноват", видите ли, TClientDataset?

Зашибсись логика)


 
Jungle   (2009-03-31 13:55) [4]


> А TClientDataset-то тут причем ?


Массив я привёл в качестве иллюстрации ожидаемого поведения TClientDataSet.
Т.е. при работе с массивом память резервируется и освобождается так, как я того ожидаю. А вот при работе с TClientDataSet всё не так.
Я упомянул 2 инструмента - проверь.


 
sniknik ©   (2009-03-31 14:15) [5]

> Я упомянул 2 инструмента - проверь.
делать больше нечего как бред проверять... ведь у тебя явно написан бред, раз ты его настолько стесняешься, что даже свой код для проверки не привел (проверять имеет смысл именно его).
а если я напишу не так как ты. и у меня все очистится? что дальше?

давай попробуем. вот считай  проверил, результат - очищается! и?


 
Jungle   (2009-03-31 14:43) [6]

sniknik
1. Видимо, действительно, нечего делать, ибо если бы было чем заняться - не писал бы неинформативные сообщения.

2. Допустим, мне действительно стыдно - ведь код не работает так как мне надо, но если у тебя всё нормально работает - тебе-то чего стесьняться? Наоборот - прекрасная возможность продемонстрировать свой профессионализм и утереть нос салаге.

Вывод: ты просто трепло.

3. Вот мой код.

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, DB, DBClient, Grids, DBGrids, GridsEh, DBGridEh;

type
 TForm1 = class(TForm)
   ClientDataSet1   : TClientDataSet;
   ClientDataSet1f1 : TIntegerField;
   ClientDataSet1f2 : TStringField;
   DataSource1      : TDataSource;
   Button1          : TButton;
   DBGridEh1        : TDBGridEh;
   Button2          : TButton;
   Button3          : TButton;
   Button4          : TButton;
   btn1             : TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
   procedure Button4Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure btn1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

var ar: array of Integer;

procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;

begin
 ClientDataSet1.DisableControls;

 for i := 1 to 50000 do
   ClientDataSet1.AppendRecord([i, "lazha!"]);

 ClientDataSet1.EnableControls;

 ClientDataSet1.Cancel;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 if ( ClientDataSet1.IsEmpty ) then exit;

 ClientDataSet1.Last;
 ClientDataSet1.Delete;
end;

procedure TForm1.Button3Click(Sender: TObject);
var i: Integer;
begin
 ClientDataSet1.DisableControls;
 ClientDataSet1.EmptyDataSet;
 ClientDataSet1.EnableControls;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
 SetLength(ar, 250000);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 ClientDataSet1.LogChanges := False;
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
 SetLength(ar, 0);
end;

end.


 
sniknik ©   (2009-03-31 14:57) [7]

> продемонстрировать свой профессионализм
это все давно в прошлом. да и был такой период недолго, после становиться пофигу.

почему не вижу Close у рекордсета? решил, что Delete физически удаляет запись? таки нет. их даже посмотреть можно (как то фильтром управляется, хотя не помны может это для ADORecordset-а, но принцип должен быть примерно тот же)


 
Jungle   (2009-03-31 15:31) [8]

sniknik
За трепло прошу прощения. Был не в себе :)

Чуток изменил код:
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;

begin
 ClientDataSet1.DisableControls;

 if ( not ClientDataSet1.Active ) then
 begin
   ClientDataSet1.CreateDataSet;
   ClientDataSet1.Open;
 end;

 for i := 1 to 50000 do
   ClientDataSet1.AppendRecord([i, "lazha!"]);

 ClientDataSet1.EnableControls;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 ClientDataSet1.DisableControls;
 ClientDataSet1.EmptyDataSet;
 ClientDataSet1.Close;
 ClientDataSet1.EnableControls;
end;


Что наблюдается в ProcessExplorer"е:
1. После старта : 4.8  Mb
2. Fill DS       : 7.2  Mb
3. Clear DS      : 5.6  Mb
4. Fill DS       : 9.3  Mb
5. Fill DS       : 34.4 Mb
6. Clear DS      : 5.0  Mb
7. Fill DS       : 9.5  Mb
8. Clear DS      : 6.8  Mb


Кстати, на этом маленьком проекте FastMM не ругается. Ругается на другом. Но именно после манипуляций с DataSet"ом. Если его не трогать - не ругается. Иных утечек тоже не показывает. Вот и не знаю - то ли я облажался, то ли одно из двух :)
Надо какой-нибудь другой менеджер памяти попробовать для чистоты эксперимента.


 
Сергей М. ©   (2009-03-31 15:41) [9]

9. Close DS     : что кажет PE ???
10. Сверни-разверни форму : что кажет PE ???


 
Jungle   (2009-03-31 15:57) [10]

Сергей М.

Поскольку Close DS делается при каждом Clear DS, то оставлю пункт 10.
Вот новые результаты:

1.  4.8  Mb
2.  7.8  Mb
3.  6.3  Mb
4.  9.4  Mb
5.  35.5 Mb
6.  31.4 Mb
7.  8.7  Mb
8.  6.0  Mb
10. 5.5  Mb


 
Сергей М. ©   (2009-03-31 20:01) [11]


> оставлю пункт 10


Все в порядке. Никаких утечек нет.


 
Jungle   (2009-04-01 09:39) [12]

Благодарю всех. Нашёл причину утечек с помощью UDebugMemoryLeak. Глупая ошибка new/dispose.


 
salexn   (2009-04-02 13:31) [13]

> Jungle
Советую посмотреть в сторону SpeedMidasFix v1.2
hxxp://andy.jgknet.de/blog/?p=437



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2010.02.28;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.004 c
15-1261231186
QAZ
2009-12-19 16:59
2010.02.28
дата=число


2-1261744929
Андрей Пл
2009-12-25 15:42
2010.02.28
Вопрос по потокам, максимально грузит процессор!


1-1238564083
EgorovAlex
2009-04-01 09:34
2010.02.28
Как правильно прочитать значение из IADsUser


2-1261639601
noob_two
2009-12-24 10:26
2010.02.28
Как правильно экспортировать overload функции из dll?


15-1260860008
Alkid
2009-12-15 09:53
2010.02.28
Вспоминая: "Почему программисты не хотят структурировать код"





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский