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.
我用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,
indx:TXMLDocument; 改成 indx : IXMLDocument;2,
indx:=TXMLDocument.Create(application);
改成
indx:=TXMLDocument.Create(nil);3,
indx.free;改成
indx := nil;还有一点,楼主留意一下你系统中安装的MSXML版本.最好装有MSXML4或MSXML3,
至于MSXML5及以上的,需修改一下TXMLDocument源码才行.
另外,在DELPHI的IMPORT TYPE LIBRARY
里面找Microsoft XML v....,从这里可以看出系统中安装了哪些版本的MSXML DOM.我不清楚XP缺省会装哪些版本的MSXML DOM,不过安装很多软件都会附带安装MSXML DOM,
也可以单独从MS网站下载