Einzelnen Beitrag anzeigen

TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.062 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: JSONValue zu wenig Arbeitsspeicher bei Array von 100MB

  Alt 16. Mär 2021, 09:20
Davon abgesehen, kannst du ggf. ein paar Schritte sparen.
Das folgende gilt für die mir vorliegende Delphi Tokyo Version, kann in späteren Ausgaben also anders aussehen.

Du holst dir vom RestResponse per Property JSONValue den geparsten JSON-Text als TJSONValue-Instanz.
Wie wir sehen, wird dafür den Inhalt von TCustomRESTResponse.Content erstmal geparst und die TJSONValue-Instanz konstruiert.

Delphi-Quellcode:
function TCustomRESTResponse.GetJSONValue: TJsonValue;
var
  LTemp: Boolean;
begin
  Result := nil;
  if Content <> 'then
    try
      GetJSONResponse(Result, LTemp);
    except
      // This method ignores exceptions
    end;
end;
Das wird dann innerhalb von TCustomRESTResponse.GetJSONResponse und tiefer in TJSONObject.ParseJSONValue und TJSONObject.ParseValue entsprechend komplexer, aufwendiger und speicherintensiv.
Dann nimmst du die TJSONValue-Instanz und rufst die ToString Methode auf.
Also um das gerade geparste Objekt wieder zu einen String zu konvertieren (Moment, was?).
Ich nehme an, wir kommen da in TJSONArray.ToString raus und erzeugen uns hier per TStringBuilder den Rückgabe-String.

Ich schlage vor, du versuchst mal folgende zwei Möglichkeiten:

1) Direkte Nutzung von RESTResponse1.Content
Delphi-Quellcode:
var
  JSONArray: TJSONArray;
  JValueAsString: string;
  JValueAsBytes: TBytes;
begin
  JValueAsString := RESTResponse.Content;
  JValueAsBytes := TEncoding.UTF8.GetBytes(JValueAsString);
  JSONArray := TJSONObject.ParseJSONValue(JValueAsBytes, 0) as TJSONArray;
end;

2) Direkte Nutzung von RESTResponse1.RawBytes
Delphi-Quellcode:
var
  JSONArray: TJSONArray;
  JValueAsBytes: TBytes;
begin
  JValueAsBytes := RESTResponse1.RawBytes;
  JSONArray := TJSONObject.ParseJSONValue(JValueAsBytes, 0) as TJSONArray;
end;
Ich bin mir an der Stelle nicht sicher, wie sich das da mit dem Encoding verhält.
Ihr konvertiert ja nicht ohne Grund explizit nach UTF-8.
Aber so als Startpunkt für weitere Optimierung ist das vielleicht schon eine gute Ausgangsbasis.

Geändert von TiGü (16. Mär 2021 um 09:22 Uhr)
  Mit Zitat antworten Zitat