Hallo!
Ich habe ein Problem bei der Übertragung großer Daten via DataSnap REST.
Die Daten sind Dateiinhalte, jedoch können auch andere Inhalte übertragen werden, da diese via Streams verschickt werden.
Bei "kleineren" Datenmengen (< 20MB) klappt alles wunderbar.
Werden die Daten (Dateien) größer, so bekomme ich immer ein "Out of memory".
Kann ich die Übertragung "stückeln" oder gibt es eine andere Lösung?
Die Frage was ist hier der richtige Weg.
Möchte/muss ja nicht den ganzen Stream in den Speicher laden, aber wie stelle ich das an.
Derzeit ist der (vereinfachte) Code wie folgt:
Delphi-Quellcode:
// Server
function TServerMethods1.GetStream(len: Int64; var ms: TStream): Boolean;
const buffer = 1024;
var m: TMemoryStream;
a: Array[1..buffer] of Byte;
cnt: Integer;
rest: Int64;
begin
Result := False;
try
FillChar(a, buffer, 'X');
ms := TMemoryStream.Create;
rest := len;
while (rest > 0) do
begin
if (rest >= buffer) then cnt := buffer else cnt := rest;
ms.Write(a, cnt);
rest := rest - cnt;
end;
Result := True;
except
//
end;
end;
// Client
procedure TForm1.Btn_GetStreamClick(Sender: TObject);
var i: Int64;
erg: Boolean;
ms: TStream;
begin
i := StrToInt(Edit3.Text); // 25184294
ms := TMemoryStream.Create;
erg := ClientModule1.ServerMethods1Client.GetStream(i, ms);
if erg then Memo1.Lines.Add('Ok - ' +IntToStr(i)) else Memo1.Lines.Add('Fehler - ' +IntToStr(i));
end;