Ошибка Delphi из памяти, когда файл dowload

Я пытаюсь загрузить файл размером 500 МБ, когда он в этом размере выдает ошибку памяти. Я попытался переключиться на 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;

delphi,

0

Ответов: 1


Не используйте здесь поток памяти. Это заставляет весь файл в непрерывный блок памяти, который, как вы обнаружили, исчерпывает память в 32-битном процессе.

Вместо этого напишите загруженные данные непосредственно в файл. Вы можете удалить промежуточный поток памяти и записать непосредственно в поток файлов.

Конечно, все это предполагает, что getDownloadвозвращает поток, который выполняет загрузку по мере ее чтения. Если он getDownloadсчитывает весь файл в поток памяти, то он испытывает ту же проблему, что и код в этом вопросе.

Дельфы,
Похожие вопросы
Яндекс.Метрика