【问题标题】:Delphi + Indy causes high page fault and RAM usageDelphi + Indy 导致高页面错误和 RAM 使用率
【发布时间】:2014-03-02 07:50:58
【问题描述】:

我遇到了一个奇怪的问题。

我使用 Delphi 和 Indy 上传和备份一些文件。 它在许多计算机(Win7 64bit,WinXP)上运行得很好。 CPU 使用率低于 1% 和最大值。 20MB 内存。

但是有一台计算机(Win 2008 R2)有问题,我不知道为什么。 CPU 使用率为 5-20%,它占用 100MB 以上的 RAM,而且增加了很多。 此外,“页面错误”上升了很多,例如。每秒 100 000 次(在我的计算机上没有增加)

代码很简单

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;

有人知道为什么“页面错误”会增加很多吗? 是否可能存在一些硬件问题?怎么找?

【问题讨论】:

  • 这可能是一个愚蠢的建议,但我首先要考虑的是防病毒软件以及 PC 上可能存在的任何病毒。
  • 页面错误通常意味着正在访问保留但未提交的内存,因此操作系统必须提交内存以供使用。例如,操作系统使用它来动态增加线程的可用堆栈空间。但这仅适用于大量堆栈使用(默认最小堆栈大小为 1MB,默认最大大小为 4MB),但 Delphi 中的大多数东西使用堆内存而不是堆栈内存。而且绝对不应该使用 100+ MB 的内存。这表明正在发生泄漏/碎片,但您显示的代码中没有任何内容会导致这种情况。
  • 是否有可能某些特定的硬件故障会导致这种情况?操作系统会在任何地方报告吗?
  • 我会传输没有文件扩展名的文件,然后在传输完成后重命名。可能是一些影子备份服务或创建还原点的 shananigans!
  • 我尝试了一个没有扩展名的文件,没有变化。此外,当我使用更大的上传缓冲区大小时,它会变得更快。 var FStack: TIdIOHandlerStack; FHTTP.IOHandler:=FStack; FStack.SendBufferSize:=512*1024; //512kB buffer 每秒 +10MB 内存

标签: delphi indy page-fault


【解决方案1】:

只需将“IdHttp := nil; IdPostData:=nil; sResponse := 'Ok'; ”放在“try”子句之前,然后再试一次

--reviewed-- 稍微修改了代码

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;

【讨论】:

  • 我不必这样做就可以看到它没有任何区别。这些变量在开始时已经为零;)
  • delphi 默认不初始化局部变量,需要先初始化,然后变量才能使用。请查看stackoverflow.com/questions/132725/…
  • 我的经验证明“本地非引用计数*变量未初始化,因此您必须先分配一个值才能使用它们。”行
  • @Onur 您是正确的,问题中的代码将try 放置在错误的位置。但从问题的角度来看,这是一个附带问题。
  • @smooty86 在调试模式下,局部变量在某些版本的 delphi 中被初始化,但在编译的可执行文件中没有被初始化。 (我没有可用于测试的最新 DEPLPHI 版本。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多