OutofMemory beim Dateieinlesen

GMoN

GMoN

Dauergast
393
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;
        }
 
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.
 
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?
 

Ähnliche Themen

S
  • Sempervivum
Antworten
2
Aufrufe
593
Sempervivum
S
B
Antworten
2
Aufrufe
1.383
deek
D
E
Antworten
4
Aufrufe
1.374
enrem
E
Zurück
Oben Unten