OutOfMemoryException ... immer noch

  • Antworten:4
p a
  • Forum-Beiträge: 131

25.11.2011, 09:07:32 via Website

Hi,

ich hab das vor kurzem schonmal gepostet und auch ein paar gute Vorschläge erhalten die mir bei der App geholfen haben und mein Verständnis für Android verbessert haben, herzliches Danke nochmal an Alle.

Nichtsdestotrotz bekomme ich immer noch beim ersten Starten der App eine OutOfMemoryException, allerdings NUR beim ersten Starten, wenn ich die App danach erneut starte läuft alles. Ergo müllt er mir beim initialisieren der App den Speicher voll und kann daher die eigentliche App nicht richtig starten.
Zur Struktur:
Beim Starten der App werden von einem Server 3 Versionsdateien als JSON gezogen und mit den in der Datenbank auf dem Handy abgelegten Versionen verglichen, wenn die Versionen auf dem Handy älter sind (oder nicht vorhanden) werden die zu den Versionsdateien korrespondierenden Listendateien als JSON gezogen und in die Datenbank auf dem Handy eingetragen.
Zwei von den Listendateien sind gzip-komprimiert, da sie eher groß sind 440kb und 5,9mb, die werden dann als GZIPInputStream geladen, in (ein immer wieder verwendetes) JSON-Objekt zerlegt und in die Datenbank geschrieben.
Bin jetzt auch schon x-mal durch den Quellcode gegangen Datenbank.java, Json.java usw und hab überall alle unnötigen Objekte entfernt und alle nötigen Objekte nach der Verwendung auf null gesetzt.

Wäre echt tierisch dankbar für Ideen oder Anregungen, weil dass jetzt so in etwa das letzte Problem ist dass ich mit der App noch habe, wenn das ausgemerzt ist müsste sie laufen.

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

25.11.2011, 09:23:02 via Website

Ob die Sachen GZip komprimiert geladen werden ist egal, die Kompression gilt nur für die Übertragung.
Auf dem Gerät wird wieder ausgepackt.

Mein Vorschlag ist immernoch:
Streamen und häppchenweise parsen.

Wenn du die App bewusst an der Grenze der Heap-Größe laufen lässt ist das extrem fragil.
Da muss sich nur ein kleiner Aspekt ändern und schon fliegt dir das Teil im produktiven Betrieb um die Ohren.

Antworten
p a
  • Forum-Beiträge: 131

25.11.2011, 09:33:29 via Website

wie kann ich es denn "Streamen und häppchenweise parsen"?

um das mal zu ergänzen, ich hatte Android nur 3 Monate in der Ausbildung, hab von daher also nicht mehr als die absoluten Basics gelernt und das hier ist jetzt meine erste "richtige" App, von daher darf ich mich wohl mit Fug und Recht als Newbie bezeichnen.

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

25.11.2011, 09:42:40 via Website

Es wurden im anderen Thread ja sogar Parser genannt, die das können.
Hab grad mal gegoogled:
http://wiki.fasterxml.com/JacksonInFiveMinutes
http://sites.google.com/site/gson/streaming

Da gibts auch ein Example für die Streaming API.

Bei den einfachen Daten die du da hast, würde ich das einfach selbst coden.
Du hast doch nur eine ewig lange Liste von Schlüssel-Wert-Paaren.

- Lies halt ein paar KB,
- zieh daraus mit einer RegularExpression die Datensätze raus und schreib die in die DB,
- Lösche den Puffer, aber achte darauf, dass du Datensatzgrenzen einhältst
- fang wieder oben an

Datensatzgrenzen heisst:
Wenn du 100KB liest, kann es sein, dass dein Puffer auf
{"Schlüssel" : "Wer
endet.
Das würde von einer Regex nicht erfasst werden und müsste mit dem nächsten Häppchen gelesen werden.

Dann musst du den Puffer natürlich nur soweit löschen, dass dieser zerhackte Datensatz drinbleibt und beim weiteren Lesen des Inputstreams dann komplettiert wird und dann auch erfasst wird.

— geändert am 25.11.2011, 09:46:34

Antworten
p a
  • Forum-Beiträge: 131

25.11.2011, 12:15:14 via Website

Soooo
jetzt hat es geklappt, mit der JsonReader-Klasse aus der GSON Library und hab da dann auch direkt noch gemerkt dass ich meine Klassen noch ein wenig umbauen musste um einige Sonderfälle abzudecken, die sind bei meiner vorherigen Rangehensweise "durch's Raster gefallen".

Vielen herzlichen Dank für Hilfe, Ratschläge und Geduld, ich hab viel gelernt und meine Liebe zu Java und auch zu Android hat sich deutlich vertieft <3

Antworten