Java / Android: java.lang.OutOfMemoryError beim Erstellen eines JSON-Objekts

8

Ich importiere JSON-Daten aus einer öffentlichen Datenbank-URI Ссылка und die Zeilen werden geöffnet so weit wie 445454. Mit dem folgenden Code baue ich das JSON-Objekt der gesamten Daten.

%Vor%

Da die Daten zu groß sind, bekomme ich 03-21 03:41:49.714: E/AndroidRuntime(666): Caused by: java.lang.OutOfMemoryError , was die Fehlerquelle auf buildr.append(line).append("\n") zeigt. Kann ich trotzdem große Datenmengen verarbeiten, ohne dass Probleme bei der Speicherzuordnung auftreten?

    
jmishra 21.03.2012, 06:21
quelle

4 Antworten

5

Das JSON ist riesig!

Sie müssen unbedingt einen Streaming-JSON-Parser verwenden. Es gibt zwei da draußen für Android: GSON und Jackson.

GSON-Streaming wird erklärt unter: Ссылка

Ich mag, wie GSON das Problem erklärt, das Sie haben:

  

Die meisten Anwendungen sollten nur die Objektmodell-API verwenden. JSON-Streaming ist nur in wenigen Situationen nützlich:

     

Wenn es unmöglich oder unerwünscht ist, das gesamte Objektmodell in den Speicher zu laden. Dies ist vor allem auf mobilen Plattformen wichtig, bei denen der Speicher begrenzt ist.

Jackson Streaming ist dokumentiert unter: Ссылка

    
louielouie 21.03.2012, 06:49
quelle
1

Wenn möglich nur Teile der Daten anfordern - das reduziert auch die Zeit für das Netzwerk und spart somit Batterie.

Andernfalls könnten Sie versuchen, die eingehenden Daten nicht im Speicher zu behalten, sondern sie auf die SD-Karte zu streamen. Wenn es dort gespeichert ist, können Sie dann darüber iterieren. Wahrscheinlich wird dies bedeuten, dass Sie Ihren eigenen JSON-Tokenizer verwenden, der keinen vollständigen Baum erstellt, aber (wie ein SAX-Parser) nur jeweils einen Teil des Objektbaums betrachten kann.

Sie können sich Jackson ansehen, wo es einen Streaming-Modus gibt, der möglicherweise anwendbar ist.

    
Heiko Rupp 21.03.2012 06:26
quelle
1

Streaming-Pull-Parser ist der Weg. Ich empfehle GSON, da dies einen kleinen Speicherfuß hat (nur Pull-Parsing ist ungefähr 16K, Jackson ist viel größer)

Ihr Code ist problematisch, weil Sie Folgendes zuweisen:

  • Puffer, um alle String-Daten vom Service
  • zu speichern
  • alle JSON-DOM-Objekte

und das ist langsam und gibt dir Gedächtnisschwäche.

Falls Sie Java-Objekte aus Ihren JSON-Daten benötigen, können Sie versuchen, meine kleine Datenbindungsbibliothek auf GSON aufzubauen (schamiert Selbstwerbung aus):

Ссылка

    
Konstantin Pribluda 21.03.2012 06:58
quelle
0

Ich habe es ein bisschen anders gemacht, Mein JSON-Code wartete auf den Status, der gegen Ende kommt. Also habe ich den Code geändert, um früher zurückzukehren.

%Vor%     
Siddharth 06.08.2014 05:17
quelle

Tags und Links