1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

OutofMemory beim Dateieinlesen

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von GMoN, 18.04.2009.

  1. GMoN, 18.04.2009 #1
    GMoN

    GMoN Threadstarter Android-Lexikon

    Beiträge:
    1,137
    Erhaltene Danke:
    131
    Registriert seit:
    01.02.2009
    Beim Versuch eine Text Datei mit ca. 57.000 Zeilen und einer Größe von 9,5MB als ArrayList einzulesen bekomme ich eine OutOfMemory Exception. Dabei steht doch jeder Anwendung 16Mb zur Verfügung.

    Gibt es eine Methode diese Datei einzulesen, welche mit weniger Speicher auskommt? Eine Datenbank ist warscheinlich nicht performant genug. Aus diesem Datenbestand müssen innerhalb von wenigen Sekunden ca 30 Einträge überprüft werden, ob sie schon vorhanden sind, falls nicht, dann müssen sie hinzugefügt werden. Das ganze funktioniert eigentlich nur im Speicher mit binärer Suche und nem schnellen sort. Ginge das mit ner Datenbank? Bei Symbinan ging es nicht als Datenbank, allerdings konnte ich da dieses 9,5 MB File problemlos als Liste komplett einlesen.

    Code:
    public static ArrayList<String> loadFile(String fileName)
            {
                if ((fileName == null) || (fileName == ""))
                    throw new IllegalArgumentException();
                
                String line;
                ArrayList<String> file = new ArrayList<String>();
    
                try
                {    
                    BufferedReader in = new BufferedReader(new FileReader(fileName));
    
                    if (!in.ready())
                        throw new IOException();
    
                    while ((line = in.readLine()) != null)
                        file.add(line);
    
                    in.close();
                }
                catch (IOException e)
                {
                    System.out.println(e);
                    return null;
                }
    
                return file;
            }
     
  2. Markus, 18.04.2009 #2
    Markus

    Markus Gewerbliches Mitglied

    Beiträge:
    76
    Erhaltene Danke:
    8
    Registriert seit:
    19.01.2009
    Musst Du denn tatsächlich alle Zeilen auf einmal im Speicher halten?
    Wenn nur wenige interessant sind, könntest Du ein Filtermechanismus oder ähnliches ergänzen.

    Wenn Du aber tatsächlich alles einlesen musst, musst Du fast auf ein byte array switchen. Allein schon weil Java Strings 2 Byte pro Character brauchen.
     
  3. GMoN, 29.04.2009 #3
    GMoN

    GMoN Threadstarter Android-Lexikon

    Beiträge:
    1,137
    Erhaltene Danke:
    131
    Registriert seit:
    01.02.2009
    Ich denke, dass ich nicht drumherum komme, alle Daten im Speicher zu haben. Ich muss ja ständig prüfen, ob neue Daten schon drin sind oder nicht.

    Von der Datenmenge, müßte man das eigentlich als richtige Datenbank realisieren aber das ist nicht schnell genug.

    Warscheinlich vergeudet die ArrayList zu viel Speicher, so richtig schnell ist sie auch nicht, das Sortieren von knapp 30.000 Zeilen dauert ca. 800ms.

    Frage, wie kann ich in Eclipse den Speicherverbrauch (RAM) meiner App sehen?
     

Diese Seite empfehlen