Delphi高手请帮忙看看关于内存的问题
我用TXMLDocument扫描大量XML文件后内存显著增加
扫描500个XML文件(文件总大小200M左右)内存增长4M左右,扫描20万个XML文件(文件总大小1G多)内存增长150M左右,
请高手看看哪儿内存没释放干净。谢谢
源程序如下:
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    dblist: TXMLDocument;
    db: TXMLDocument;
    ind: TXMLDocument;
    procedure Button1Click(Sender: TObject);
    procedure scanlm(lmname:String);
    procedure scandb(dbname:String);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}
procedure TForm1.scanlm(lmname:String);
var
  node:IXMLNode;
  temp:String;
  indx:TXMLDocument;
begin
  indx:=TXMLDocument.Create(application);
  if FileExists(lmname) then
    indx.LoadFromFile(lmname)
  else
    exit;
  node:=indx.ChildNodes.First;
  node:=node.NextSibling;
  node:=node.ChildNodes.First;
  while node<>nil do
    begin
      temp:=node.GetAttributeNS('文献名称','');
      node:=node.NextSibling;
    end;  
  Freeandnil(node);
  indx.free;
end;procedure TForm1.scandb(dbname:String);
var
  node:IXMLNode;
  lmname:String;
  dbx:TXMLDocument;
begin
  dbx:=TXMLDocument.Create(application);
  dbx.LoadFromFile(dbname);
  node:=dbx.ChildNodes.First.ChildNodes.First;
  while node<>nil do
    begin
      lmname:=node.GetAttributeNS('别名','');
      scanlm('doc\'+lmname+'\index.xml');
      node:=node.NextSibling;
    end;
  Freeandnil(node);
  dbx.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  node:IXMLNode;
  dbname,ttt:String;
  dblistx:TXMLDocument;
begin
ttt:=timetostr(now());
dblistx:=TXMLDocument.Create(application);
dblistx.LoadFromFile('dblist.xml');
node:=dblistx.ChildNodes.First.ChildNodes.First;
while node<>nil do
  begin
    dbname:=node.GetAttributeNS('数据库名','');
//    showmessage(dbname);
    scandb(dbname+'.xml');
    node:=node.NextSibling;
  end; 
  Freeandnil(node);
dblistx.Free;
showmessage(ttt+#13+timetostr(now()));
end;procedure TForm1.Button2Click(Sender: TObject);
var
  i:integer;
  t:String;
  x:TXMLDocument;
begin
  x:=TXMLDocument.Create(application);
  x.LoadFromFile('dblist.xml');
  showmessage(x.ChildNodes.First.NodeName);
end;end.

解决方案 »

  1.   

    完全FREE掉了,但是还是如此,请高手再看看
      

  2.   

    楼主代码需三个地方改动:
    1,
      indx:TXMLDocument; 改成 indx : IXMLDocument;2,
      indx:=TXMLDocument.Create(application);
    改成
      indx:=TXMLDocument.Create(nil);3,
      indx.free;改成
      indx := nil;还有一点,楼主留意一下你系统中安装的MSXML版本.最好装有MSXML4或MSXML3,
    至于MSXML5及以上的,需修改一下TXMLDocument源码才行.
      

  3.   

    楼上的朋友,我照你说的做了内存还是增长,我用的XP没刻意装MSXML,不知道XP上是什么版本的MSXML
      

  4.   

    我前面说的三处改动应该是三类改动,所有TXMLDocument声明的变量都要改
    另外,在DELPHI的IMPORT TYPE LIBRARY
    里面找Microsoft XML v....,从这里可以看出系统中安装了哪些版本的MSXML DOM.我不清楚XP缺省会装哪些版本的MSXML DOM,不过安装很多软件都会附带安装MSXML DOM,
    也可以单独从MS网站下载