Große JSON-Dateien schnell und effizient verarbeiten

Kenta1561

Bekanntes Mitglied
Hallo,

eigentlich versuche ich gerade eine Android-App zu machen, da es aber eher um allgemein Java und Performance geht, dachte ich, ich könnte auch mal hier fragen.

Es geht um folgendes: Ich benutzte eine offizielle API vom Frankfurter Flughafen, um Flüge von und nach Frankfurt zu bekommen. Das Problem bei der API ist jedoch, dass es nicht wie bei manchen anderen APIs die Möglichkeit gibt, die Zahl der Ergebnisse zu limitieren. Deshalb muss muss jedes Mal wenn die Anwendung gestartet wird insgesamt um die täglich 1300 Flüge gelesen werden, obwohl ich nur eigentlich um die 100-150 Flüge (also ungefähr im 2-stündigem Rahmen) brauche. Ich habe es hinbekommen, nur 100-150 Flüge anzuzeigen, jedoch ändert es nichts daran, dass trotzdem diese Massen an Flügen erstmal gelesen werden müssen. Wie kann ich das Ganze so optimieren, dass es schneller läuft? Oder geht es nicht?

Kenta1561
 

mrBrown

Super-Moderator
Mitarbeiter
Naja, wenn die API nicht zulässt, dass weniger geladen werden, können nicht weniger geladen werden ;)

Wenn du in der Anwendung weniger brauchst, kann man die natürlich direkt im Service/Repo/'wie auch immer du das nennst' filtern, dann bekommt die restliche Application davon nichts mit
 

Thallius

Top Contributor
Also 1300 kommt mir jetzt nicht so wahnsinnig viel vor. Das sollte man doch in weniger als 1s geparsed haben.

Aber davon mal ab würde ich das Konzept eh ändern. Du hältst die Daten einfach lokal auf dem device und machst bei jedem Start der App einen Request im Hintergrund der die Flugdaten aktualisiert. Damit hat der User (ausser beim allerersten Start der App) überhaupt keine Wartezeit und kann sogar offline arbeiten wenn es nötig ist.

Gruß

Claus
 

Kenta1561

Bekanntes Mitglied
@Thallius Stimmt, danke für die Idee :D Ich denke auch dass nicht das Parsen viel Zeit kostet, sondern das eigentliche herunterladen. (Wenn man im Playground von der API rumprobiert dauert das Laden sehr lange (es wird nicht geparsed sondern einfach als Text angezeigt))
 

mrBrown

Super-Moderator
Mitarbeiter
Du kannst dir mit time in der Konsole ausgeben lassen, wie lange curl braucht, nen Browser dafür nutzen ist doch Unsinn...
 

Kenta1561

Bekanntes Mitglied
Hallo,

danke für die ganzen Antworten. Ich habe gerade herausgefunden, dass die Verzögerung nicht am Herunterladen der Daten oder an der Visualisierung der Daten liegt, sondern am Lesen der JSON-Datei.
Ob ich erst mit OkHttp die Response mit body().string() in ein String umwandle oder erst im JsonReader mit new JsonReader(new InputStreamReader(body().byteStream()) ist egal, es dauert fast genau so lange.
Es wäre halt echt am besten wenn ich die Zahl der Flüge begrenzen könnte, leider geht das nicht. Weil es ja wie schon erwähnt bereits am Lesen liegt, bringt es auch nichts, beim durchgehen des Flüge-Arrays bzw. Entry-Sets zum Beispiel mit einem Integer-Counter bei 100 Flügen mit return abzubrechen. Die Idee mit den lokalen Daten ist eigentlich ganz gut, aber gibt es auch eine alternative, schnelle Möglichkeit wenn ich immer die Daten auf dem Bildschirm aktuell halten möchte?

PS:
Ich habe das sogenannte Streaming bei Gson gefunden, was angeblich nicht die komplette Datei erstmal lädt, sondern erst bei Bedarf. Ich bin mir ziemlich sicher dass dadurch die App schneller starten kann, jedoch
sind die Json-Antworten von der API so komisch gebaut (Manchmal nehmen sie wenn sie keine richtigen Werte als Antwort haben null als Value, manchmal lassen die die Tags auch komplett raus), dass es fast unmöglich scheint, durch next(), begin() und end() blind die ganze Json-Datei zu durchforsten.

Kenta1561
 

mrBrown

Super-Moderator
Mitarbeiter
danke für die ganzen Antworten. Ich habe gerade herausgefunden, dass die Verzögerung nicht am Herunterladen der Daten oder an der Visualisierung der Daten liegt, sondern am Lesen der JSON-Datei.
Ob ich erst mit OkHttp die Response mit body().string() in ein String umwandle oder erst im JsonReader mit new JsonReader(new InputStreamReader(body().byteStream()) ist egal, es dauert fast genau so lange.
Wie lange dauert es denn überhaupt?

Ich habe das sogenannte Streaming bei Gson gefunden, was angeblich nicht die komplette Datei erstmal lädt, sondern erst bei Bedarf. Ich bin mir ziemlich sicher dass dadurch die App schneller starten kann, jedoch
sind die Json-Antworten von der API so komisch gebaut (Manchmal nehmen sie wenn sie keine richtigen Werte als Antwort haben null als Value, manchmal lassen die die Tags auch komplett raus), dass es fast unmöglich scheint, durch next(), begin() und end() blind die ganze Json-Datei zu durchforsten.
Ob die Tags vorhanden sind oder nicht oder null sind ist eigentlich egal, solange GSON das parsen kann, kann er es parsen - du nutzt doch jetzt schon GSON?
 

Kenta1561

Bekanntes Mitglied
@mrBrown Eigentlich wollte ich mit gson.fromJson die Json-Datei parsen, jedoch wusste ich nicht wie ich zum Beispiel folgendes parsen sollte:

"codeShares": [
{
"codeShare": {
...
}
}, (usw.)

codeShare ist hierbei irgendwie doppelt? geschachtelt und ich weiß nicht wie ich das mit gson.fromJson() parsen kann. Deshalb habe ich immer nur mit
getAsJsonObject(), get(), getAsJsonArray() usw. die Json-Datei geparsed.

Kenta1561
 

mrBrown

Super-Moderator
Mitarbeiter
Ne, da ist nichts doppelt, das heißt anders.

Generell nutzt man GSON, in dem man Klassen mit gleicher Struktur wie das JSON hat, in welches dann die Daten überführt werden.
In dem Fall halt ein Array von Objekte, aber der Ausschnitt ist etwa knapp und unvollständig, um da was zu sagen...
 

Kenta1561

Bekanntes Mitglied
@mrBrown
Also, ich bin jetzt bis hierhin gekommen:

Die Variablen sind:
private OperatingAirline operatingAirline;
private AircraftType aircraftType;
private FlightNumber flightNumber;
private List<FlightNumber> codeShares;

"codeShares": [
{
"codeShare": {
"airlineCode": "LH",
"trackNumber": "9695",
"suffix": ""
}
},
{
"codeShare": {
"airlineCode": "NH",
"trackNumber": "5350",
"suffix": ""
}
},
{
"codeShare": {
"airlineCode": "TP",
"trackNumber": "8988",
"suffix": ""
}
},
{
"codeShare": {
"airlineCode": "UA",
"trackNumber": "7212",
"suffix": ""
}
}
]

Die Liste mit FlightNumber an sich wird normal gelesen, wenn ich die Größe von der Liste mir ausgeben lasse wird auch die richtige Größe genannt (4). Jedoch sind die Variablen der FlightNumber-Klasse alle null,
was darauf deutet, dass die Werte nicht richtig gelesen wurden. Ich verstehe jetzt aber nicht, wie, wo und welche Annotation ich hinzufügen muss.

Kenta1561
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Welcher Datentyp für sehr große Zahlenbereiche? Allgemeine Java-Themen 1
F Große Datenmengen effizient programmieren Allgemeine Java-Themen 51
N Das große O berechnen Allgemeine Java-Themen 2
F Best Practice Große Anzahl an Objekten speichern und lesen Allgemeine Java-Themen 19
R Große Zahlen in Worten abkürzen Allgemeine Java-Themen 10
K Große Mengen an Daten speichern Allgemeine Java-Themen 9
VfL_Freak Große und seltsame Probleme nach Java-Update auf V1.8.0_91 Allgemeine Java-Themen 3
E Best Practice Verdammt große Objekte Allgemeine Java-Themen 10
P Große Datenstruktur im Speicher halten Allgemeine Java-Themen 13
M Einfluss von Caching auf die Performance (große Arrays) Allgemeine Java-Themen 24
U Große Liste von Strings mit indiziertem Zugriff Allgemeine Java-Themen 31
P Datentypen Große Datenmenge Sortiert halten Allgemeine Java-Themen 12
D große Textdatei filtern Allgemeine Java-Themen 13
M Große Datei mit Regex durchsuchen Allgemeine Java-Themen 4
R POI große Exceldatei schreiben Allgemeine Java-Themen 7
R Dateigestützte Collection für große Datenmengen Allgemeine Java-Themen 5
K Scanner - große Textfile, nur 0 ab betim. Wert Allgemeine Java-Themen 4
trash Das große Problem: .jar Archiv Allgemeine Java-Themen 19
J Große Datei einlesen und gestückelt verarbeiten Allgemeine Java-Themen 4
I Große Datei am effektivsten/performantesten auslesen und auswerten? Allgemeine Java-Themen 6
S große CSV-Dateien Importieren. Beste Lösung ?! AWS,S3,Hadoop!? Allgemeine Java-Themen 4
P große double Zahlen und modulo Allgemeine Java-Themen 8
O Große Anzahl Bilder laden Allgemeine Java-Themen 7
A Mit RegEx große Dokumente erfassen Allgemeine Java-Themen 14
X Wie verdammt große Datein öffnen? Allgemeine Java-Themen 2
G Große Datenmengen per JDBC Allgemeine Java-Themen 5
P Große Datenmenge wie speichern (HashMap? TreeMap?) Allgemeine Java-Themen 11
G Große XML-Dateien einlesen und auswerten . Allgemeine Java-Themen 2
P Performance: Ziehen ohne Zurücklegen (große Datenmenge) Allgemeine Java-Themen 10
I JNI - Große Daten übertragen Allgemeine Java-Themen 6
T Große Dateibestände löschen - Speicherproblem Allgemeine Java-Themen 20
S Große ArrayListen Allgemeine Java-Themen 8
S große Datei einlesen! Allgemeine Java-Themen 7
J Große Zahl (double) as text ausgeben? Allgemeine Java-Themen 2
S Kleines Eclipse Problem, große Wirkung Allgemeine Java-Themen 7
H Referenzen statt Objekte für große Speicherstrukturen Allgemeine Java-Themen 19
K Große Herausforderung Allgemeine Java-Themen 2
F Zu große Werte beim byteweisen Lesen mit BufferedReader.read Allgemeine Java-Themen 5
D Große Klasse - was fällt euch so ins Auge? Kritik bitte! Allgemeine Java-Themen 10
M Große Dateien laden Allgemeine Java-Themen 2
F Große Dateien schnell einlesen Allgemeine Java-Themen 14
M JSON Parsing von youtube video comment replies Allgemeine Java-Themen 4
D Read JSON File Problem Allgemeine Java-Themen 9
W JSON parsen eines ,mit JS.stringify erstellten Strings Allgemeine Java-Themen 27
O JSON in Integer parsen Allgemeine Java-Themen 5
F Junit Test + Cucumber - JSON auslesen und in einem weiteren Schritt nutzen Allgemeine Java-Themen 0
J JSON Daten von einer Webseite erhalten Allgemeine Java-Themen 2
G Json POST-REQUEST Allgemeine Java-Themen 14
J json Array würfel Spalten durcheinander Allgemeine Java-Themen 9
Mario1409 Methoden JSON Array von URL Allgemeine Java-Themen 8
D JSON to String Allgemeine Java-Themen 31
F Json in sql speichern und lesen Allgemeine Java-Themen 10
F Alte Passörter mit Gson und Json in SQL speichern? Allgemeine Java-Themen 5
C Nested JSON in Java ansprechen [Wordpress Rest Api] Allgemeine Java-Themen 26
J Frage zum Entwurf / json-Datenmodell Allgemeine Java-Themen 8
2 mehrere Json Werte Parsen Allgemeine Java-Themen 3
agent47 JSON verarbeiten Allgemeine Java-Themen 4
G JSON parsen Allgemeine Java-Themen 3
Thallius Simple JSON Parser Error null Allgemeine Java-Themen 6
J Java JSON-Datei aus .Zip auslesen und Download mit Progress Bar Allgemeine Java-Themen 20
L Lib gesucht: Java-Objekte mit JSON Allgemeine Java-Themen 2
M Changelog aus JSON Allgemeine Java-Themen 2
M JSON NullPointerException Allgemeine Java-Themen 5
B json zu java class Allgemeine Java-Themen 2
F Java Restapi JSON Allgemeine Java-Themen 5
G Json-Lib NoClassDefFoundError Allgemeine Java-Themen 3
O JSON String bauen aus Liste Allgemeine Java-Themen 2
O Vorteile von GSON ggü. JSON "per Hand" Allgemeine Java-Themen 4
O JSON: ClassNotFound Allgemeine Java-Themen 8
C Strings und JSON Objekte so klein wie möglich im Speicher ablegen Allgemeine Java-Themen 5
J Lucene suche in Json (CouchDB) Allgemeine Java-Themen 2
K Regex JSON Allgemeine Java-Themen 3
G JSON Object auslesen Allgemeine Java-Themen 1
W Vergleichstool für xml-Dateien Tortoise-svn Verknüpfung Allgemeine Java-Themen 2
W ICEpdf PDF-Dateien werden mit Java 21 nicht nicht mehr vollständig dargestellt Allgemeine Java-Themen 3
Thomasneuling Java Jar datei erstellen, von Projekt, dass auch Javafx Dateien, FXML Dateien und CSS Dateien, sowie Bilder enthält? Allgemeine Java-Themen 14
G Dateien lesen Allgemeine Java-Themen 3
OnDemand Unterschiedliche jar Dateien zusammen führen Allgemeine Java-Themen 8
A Sicheres Löschen von Dateien Allgemeine Java-Themen 7
O git ignore für Intellji braucht es die .idea Dateien? Allgemeine Java-Themen 8
Master3000 Dateien zwischen verschiedenen Netzwerken senden Allgemeine Java-Themen 17
L Jar Dateien in Classpath laden ab JDK 9+ Allgemeine Java-Themen 11
d.lumpi JDA eclipse dateien versenden Allgemeine Java-Themen 4
O Produziert das Tool "jpackage" (ab JDK 14) .exe Dateien, die auf einer Zielumgebung ohne JRE lauffähig sind ?` Allgemeine Java-Themen 7
O Wie kann ich in Apache POI (Excel Dateien schreiben) Datumszellen in Excel erzeugen Allgemeine Java-Themen 6
T Meine Frage lautet wie ich 2 CSV Dateien miteinander in Java verbinde und Spalten die zueinander gehören durch den gleichen Key zusammen ausgebe? Allgemeine Java-Themen 5
L Dateien richtig auslesen Allgemeine Java-Themen 6
L Eclipse Runnable Jar mit Dateien Allgemeine Java-Themen 8
W Server-Thread schreibt nicht alle Dateien Allgemeine Java-Themen 6
MiMa Logging mit log4j2 in verschiedene Dateien? Allgemeine Java-Themen 22
I Klassen aus Jar-Dateien aus anderem Ordner laden Allgemeine Java-Themen 3
O jar und EXE Dateien, Pfade zur Laufzeit Allgemeine Java-Themen 1
W Dateien werden nicht gelöscht - warum? Allgemeine Java-Themen 12
B Dateien / Bilder von "webapp" Ordner bekommen? Allgemeine Java-Themen 1
P Erste Schritte Dateien löschen Allgemeine Java-Themen 4
H Erste Schritte Ausführbare Dateien lassen sich nicht starten Allgemeine Java-Themen 5
I Java als exe veröffentlichen inkl. kompletter Dateien Allgemeine Java-Themen 4
M Drucken von Dateien Allgemeine Java-Themen 10
J jar Dateien unter Windows 7 mit spezifischer jdk öffnen Allgemeine Java-Themen 2
I Laden von Informationen aus Dateien: Austauschbarkeit: 2 Dateien sinnvoll? Allgemeine Java-Themen 2

Ähnliche Java Themen


Oben