XML + Утечка памяти.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

XML + Утечка памяти.

Сообщение Vladimir_Ivanov » 13.03.2010 18:45:15

Загрузка свойств(полей) класса происходит из xml файла данной процедурой:
Код: Выделить всё
procedure T1DPC.LoadFromFile(const XMLFileName: String);
var XML:TXMLDocument;
    Node,NodeLayer: TDOMNode;
    List:TDOMNodeList;
    PLayer:PLayer1DPC;
    I:integer;
begin

Try
     // Читаем xml файл с жесткого диска
     ReadXMLFile(XML, XMLFileName);
     XML.AfterConstruction;
     List:=XML.DocumentElement.ChildNodes;
     Node:=List[0];
     if Node.NodeName='Properties' then
      begin
      Self.Name:=Node.Attributes.GetNamedItem('Name').NodeValue;
      Self.Description:=Node.Attributes.GetNamedItem('Description').NodeValue;

      Self.EpsilonFirst.Re:=StrToFloat(Node.Attributes.GetNamedItem('EpsilonF_Re').NodeValue);
      Self.EpsilonFirst.Im:=StrToFloat(Node.Attributes.GetNamedItem('EpsilonF_Im').NodeValue);
      Self.EpsilonLast.Re:=StrToFloat(Node.Attributes.GetNamedItem('EpsilonL_Re').NodeValue);
      Self.EpsilonLast.Im:=StrToFloat(Node.Attributes.GetNamedItem('EpsilonL_Im').NodeValue);
      end;
   
finally
       XML.Free;
       XML:=Nil;
end;
end;//procedure T1DPC.LoadFromFile(const XMLFileName: String);

Все работает ок. При загрузке съедается память, при чем именно XML есть а не сам класс*, так как он уже создан и идет заполнение полей. Данная память освобождается при сворачивании программы, как это реализовать программно, возможно послать какое-то вин сообщение окну? Потому что при работе программы «при автопилоте», идет чтение иногда до 1000 xml файлов, из за чего выделяется до 1GB. (что шокирует некоторых). Если после работы программу свернуть, выделенной памяти будет порядка 800 килобайт.
Как освобождать после каждого применения процедуры.
* - если заполнять свойства ну скажем в цикле (for i:=1 to 1000 do) то никакой утечки нет.
Заранее Спасибо.
Vladimir_Ivanov
незнакомец
 
Сообщения: 6
Зарегистрирован: 13.03.2010 18:10:47

Re: XML + Утечка памяти.

Сообщение Sergei I. Gorelkin » 13.03.2010 23:46:28

Если версия FPC меньше чем 2.4.0, то переменную List надо освобождать (Free) отдельно. Еще лучше заменить использование ChildNodes на цикл с использованием FirstChild и NextSibling.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: XML + Утечка памяти.

Сообщение Vladimir_Ivanov » 16.03.2010 19:14:29

Да действительно, при переходе на FPC 2.4.1 все стало хорошо работать. Почитал изменения к 2.4.1, там как раз и сказано, что допилили XMLRead. А именно удаление (освобождение – Free) List.
Раньше: Загрузка 1000 Xml файлов, выделялось до 500 МБ. , для освобождения приходилось свернуть программу, потом развернуть.

Сейчас: Загрузка 10 000 (в 10 раз больше) Xml фалов, выделяется всего 20 МБ., но все так же для ее освобождение необходимо программу свернуть, а потом развернуть.
Для автоматизма я при таком объеме работы делаю так:
…. Работа с xml ;
Application.Minimize;
Application.Restore;
Но все же и тут есть ложка дегтя. Замечено, что при вкл программы и ее сворачивании занято 520 КБ.
При Загрузке 10 000 XML Файлов и сворачивании, уже занято 544,
При третей загрузке – 588 и тк далее, т. е. утечка где то есть. Но возможно это уже моя ошибка, в каком то месте.
И еще, при работе в цикле занимается 20 МБ. Это конечно не 1ГБ, как было раньше(2.2.4), но все же это еще не 0. Наверное к 2.6 XML до конца допилят и мы получим маленькую и удобную библиотеку работы с XML. :)
Спасибо за ответ.
Vladimir_Ivanov
незнакомец
 
Сообщения: 6
Зарегистрирован: 13.03.2010 18:10:47

Re: XML + Утечка памяти.

Сообщение Sergei I. Gorelkin » 16.03.2010 19:37:12

Цифры, которые показывает виндовый TaskManager, можно сказать что вообще не относятся к реально выделяемой памяти.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15

Рейтинг@Mail.ru