下载文件时发生Delphi内存不足错误

时间:2018-07-23 20:34:31

标签: delphi

当此大小的文件出现内存不足错误时,我正尝试下载500 mb以上的文件。我尝试切换到64位应用程序,并且它起作用了。但是我需要它可以在32位应用程序中工作以下载文件。

var
  Stream: TStream;
  fileStream: TFileStream;
  Buffer: PByte;
  BytesRead, BufSize: Integer;
  Size: int64;
begin
  BufSize := 1024;
  fileStream:= TFileStream.Create(GetCurrentDir()+'\DownloadFile.zip', 
                                  fmCreate);
  GetMem(Buffer, BufSize);

  Stream := getDownload(size);

  if (Size <> 0) then
  begin
    repeat
       BytesRead := Stream.Read(Pointer(Buffer)^, BufSize);

       if (BytesRead > 0) then
       begin
          fileStream.WriteBuffer(Pointer(Buffer)^, BytesRead);
       end;
       Application.ProcessMessages
    until (BytesRead < BufSize);

    if (Size <> fileStream.Size) then
    begin
      exit;
    end;
  end;

  finally
     FreeMem(Buffer, BufSize);
     fileStream.Destroy;
  end;
end;   

function TServiceMethods.getDownload(out Size: Int64): TStream;
begin
  Result := TFileStream.Create(GetCurrentDir+'\DownloadFile.zip', fmOpenRead 
  or fmShareDenyNone);
  Size := Result.Size;
  Result.Position := 0;
end;

1 个答案:

答案 0 :(得分:5)

在这里不要使用内存流。这迫使整个文件进入一个连续的内存块,正如您发现的那样,它在32位进程中耗尽了内存。

相反,将下载的数据直接写入文件。您可以删除中间内存流,然后直接将其写入文件流。

当然,所有这些都假定getDownload返回的流在您阅读时执行下载。如果getDownload将整个文件读到一个内存流中,那么它将遭受与该问题中的代码完全相同的问题。