AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi JSONValue zu wenig Arbeitsspeicher bei Array von 100MB
Thema durchsuchen
Ansicht
Themen-Optionen

JSONValue zu wenig Arbeitsspeicher bei Array von 100MB

Ein Thema von stalkingwolf · begonnen am 16. Mär 2021 · letzter Beitrag vom 17. Mär 2021
 
TiGü

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

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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz