Delphi 德尔福+;Indy导致页面错误和RAM使用率高

Delphi 德尔福+;Indy导致页面错误和RAM使用率高,delphi,indy,page-fault,Delphi,Indy,Page Fault,我遇到了一个奇怪的问题 我使用Delphi和Indy来上传和备份一些文件。 它在许多计算机上运行良好(Win7 64位,WinXP)。 CPU使用率低于1%,RAM最大为20MB 但是有一台电脑(Win2008R2)有问题,我不知道为什么。 CPU使用率为5-20%,需要100MB+的RAM,而且增加了很多。 此外,更多的“页面错误”增加了很多,例如每秒10万次(在我的电脑上没有增加) 代码非常简单 var IdHTTP: TIdHTTP; IdPostData: TIdMultiPar

我遇到了一个奇怪的问题

我使用Delphi和Indy来上传和备份一些文件。 它在许多计算机上运行良好(Win7 64位,WinXP)。 CPU使用率低于1%,RAM最大为20MB

但是有一台电脑(Win2008R2)有问题,我不知道为什么。 CPU使用率为5-20%,需要100MB+的RAM,而且增加了很多。 此外,更多的“页面错误”增加了很多,例如每秒10万次(在我的电脑上没有增加)

代码非常简单

var
  IdHTTP: TIdHTTP;
  IdPostData: TIdMultiPartFormDataStream;
  sResponse: string;
begin
  IdHTTP := TIdHTTP.Create(nil);
  IdPostData:=TIdMultiPartFormDataStream.Create;

  try
    IdPostData.AddFile('file', 'C:\data.dat', '');

    sResponse:=IdHTTP.Post('http://web.com', IdPostData);

    ShowMessage(sResponse);
  finally
    IdHTTP.Free;
    IdPostData.Free;
  end;
end;
有人知道为什么“页面错误”会增加这么多吗? 是否可能存在某些硬件问题?如何找到它?

只需在“try”子句之前加上“IdHttp:=nil;IdPostData:=nil;sResponse:='Ok';”,然后重试

--已审阅--稍微更改了代码

procedure SendFile;
var
  IdHTTP: TIdHTTP;
  IdPostData: TIdMultiPartFormDataStream;
  sResponse: string;
begin
  sResponse := 'OK';
  IdHTTP := TIdHTTP.Create(nil);
  IdPostData:=TIdMultiPartFormDataStream.Create;
  try
    IdPostData.AddFile('C:\data.dat', 'data.dat', '');

    IdHTTP.Post('http://www.yahoo.com', IdPostData);

    ShowMessage(sResponse);
  finally
    IdHTTP.Free;
    IdPostData.Free;
  end;
end;

也许这是一个愚蠢的建议,但我首先要考虑的问题是防病毒和电脑上可能存在的任何病毒。页面错误通常意味着正在访问保留但未提交的内存,因此操作系统必须提交内存以供使用。例如,操作系统使用它来动态增加线程的可用堆栈空间。但这只适用于大量的堆栈使用(默认的最小堆栈大小为1MB,默认的最大堆栈大小为4MB),但是Delphi中的大多数东西都使用堆内存而不是堆栈内存。而且绝对不应该使用超过100 MB的内存。这表明正在发生泄漏/碎片,但您显示的代码中没有任何内容会导致泄漏/碎片。是否可能是某些特定的硬件故障导致了泄漏/碎片?操作系统会在任何地方报告它吗?我会传输没有文件扩展名的文件,然后在传输完成后进行重命名。这可能是一些影子备份服务或还原点制造的恶作剧!我尝试了一个没有扩展名的文件,没有更改。此外,当我使用更大的上传缓冲区时,它会变得更快<代码>var FStack:TIdIOHandlerStack;FHTTP.IOHandler:=FStack;FStack.SendBufferSize:=512*1024//512kB缓冲区RAMI中每秒+10MB的缓冲区不必这样做,就不会有任何区别。这些变量在开始时已为零;)默认情况下,delphi不会初始化局部变量,您必须先初始化它们,然后才能使用该变量。请检查我的经验“本地非引用计数*变量未初始化,因此在使用它们之前必须赋值。”line@Onur问题中的代码将
try
放在了错误的位置,这是正确的。但从问题的角度来看,这是一个次要问题。@smooty86在调试模式下,局部变量在某些版本的delphi中初始化,但在编译的可执行文件中没有初始化。(我没有最新的DEPLPHI版本可供测试。)