[英]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.