簡體   English   中英

下載文件時出現Delphi內存不足錯誤

[英]Delphi out of memory error when dowload file

我試圖下載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;

不要在這里使用內存流。 這迫使整個文件進入一個連續的內存塊,正如您發現的那樣,它在32位進程中耗盡了內存。

而是直接將下載的數據寫入文件。 您可以刪除中間內存流,然后直接將其寫入文件流。

當然,所有這些都假設getDownload返回在您閱讀時執行下載的流。 如果getDownload將整個文件讀入內存流,那么它將遭受與該問題中的代碼完全相同的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM