BufferedReader OutOfMemory umgehen?

japa

Aktives Mitglied
Hi, ich suche eine Möglichkeit große Datei einlesen zu können.

Mit BufferedReader konnte ich ca. 500.000 Zeilen lesen, aber mehr leider auch nicht, ich habe 1000000 Zeilen, die ich lesen muss.

Ich habe nachgeschaut, dass man seine Memory irgendwie erhöhen kann, ich finde diese Lösung nicht so gut, daher suche ich eine andere Lösung z.B:

Die ersten 1000 Zeilen lesen - verarbeiten

Memory freigeben

Die nächsten 1000 Zeilen fortsetzen lesen - verarbeiten ...

Ich kenn mich leider mit Java nicht sehr gut aus, sowas buffer.ReadLine (lineIndex) wäre echt optimal.

gruß
japa
 

ARadauer

Top Contributor
Wenn du nicht alle Zeilen im Speicher halten musst, würde ich das einfach nicht machen.

Wenn schon mit dem Parameter -Xmx1024m als start parameter kannst du java mehr speicher geben
 

japa

Aktives Mitglied
Ich habe die große Datei in 8 kleinere gemacht.
Obwohl ich nach jeder Datei .close() aufrufe, wird es nicht im Speicher bereinigt, sodass ich immer noch OutOfMemory habe.

-Xmx1024m hat zwar geholfen, aber das kann doch keine Lösung sein, wenn ich weniger Speicher hätte (4GB), würde es dann garnichts gehen?
 

Attila

Bekanntes Mitglied
die einfachste Lösung:
Java:
BufferedReader buffer = null;
try {
    buffer = new BufferedReader(new FileReader("file.txt"));
    String line;
    while ((line = buffer.readLine()) != null) {
        // line verarbeiten
    }
} catch (IOException e){ 
    // ...
}

jede 1000 Zeilen verarbeiten:
Java:
BufferedReader buffer = null;
StringBuilder sb = new StringBuilder();
try {
    buffer = new BufferedReader(new FileReader("file.txt"));
    String line;
    int lineCounter = 0;
    while ((line = buffer.readLine()) != null) {
        sb.append(line);
        // sb.append(line+"\n");    // + CRLF
        lineCounter++;
        if (lineCounter > 999){
            // 1000 Zeilen verarbeiten
            verarbeitung(sb);
            lineCounter = 0;
            sb.setLength(0); // buffer freigeben
        }
    }
    if (lineCounter > 0){
        verarbeitung(sb);
    }
} catch (IOException e){ 
    // ...
}


public void verarbeitung(StringBuilder sb){
    // buffer (max. 1000 Zeilen) verarbeiten
}
 

japa

Aktives Mitglied
Java:
  public void buildFromTsvFile(String fileName) throws IOException {

   FileReader fileReader = new FileReader(fileName);
    BufferedReader bufferedReader = new BufferedReader(fileReader);
        int documentId = 0;
    while (true) {
      String line = bufferedReader.readLine();
      if (line == null) { break; }
      String[] words = line.split("\\W+");       
      // System.out.println(Arrays.toString(words));
      for (String word : words) {
        word = word.toLowerCase();
        if (!invertedListsInt.containsKey(word)) {
          invertedListsInt.put(word, new ArrayList<Integer>());
        }
        invertedListsInt.get(word).add(documentId);
      }
      documentId++;
    }
    // Resource wieder freigeben    
    bufferedReader.close();
    this.DocuSize = documentId;
  }

@Attila Danke für deine Mühe, aber der Code wird bei mir auch nicht funktionieren, das Prinzip habe ich verstanden, aber Java gibt dem memory von dem Buffer nicht frei.
Das ist das Hauptproblem.

Der obige Code verarbeitet sogar jede Zeile, aber nach ca. 250 000 Zeilen ist die 256MB Memory voll wegen dem Buffer.

Daher suche ich eine andere Lösung z.B:
- Zeile 1 bis 1000 Lesen dann Buffer aufräumen, Problem ist, dass gelesene Zeilen nicht freigegeben gibt, sodass Memory voll wird.
- oder, Datei i verarbeiten, dann Buffer aufräumen, dann Datei i + 1 usw ... (Problem ist dass buffer.close() nicht funktioniert.
- oder, Buffer nur Teil der Datei einliest und Abschnitten sofort freigeben, so ein Buffer habe ich leider in Java noch nicht gefunden.
 

Attila

Bekanntes Mitglied
BufferedReader ist in Ordnung.
Map (invertedListInt) verursacht das Problem:
Java:
if (!invertedListsInt.containsKey(word)) {
      invertedListsInt.put(word, new ArrayList<Integer>());
}
// hauptsächlich diese Zeile !!!
invertedListsInt.get(word).add(documentId);
 

DrZoidberg

Top Contributor
Wenn du 1.000.000 Zeilen hast und jede Zeile im Durchschnitt 10 Wörter enthält, dann macht das 10.000.000 Wörter. Das heisst du erstellst 10.000.000 Integer Objekte. Ein Integer Objekt benötigt ca. 20 Byte. Das sind dann schon mal mindestens 200MB allein für die Integers.
Um den Speicherverbrauch zu reduzieren, könntest du dir z.B. deine eigene ArrayList Klasse schreiben, die primitive ints verwendet anstelle von Integern.
Vielleicht ist es auch gar nicht nötig, die gesamte HashMap im Ram zu haben. Was machst du denn mit invertedListsInt nachdem du dort alle Zahlen eingetragen hast?
 

Attila

Bekanntes Mitglied
Als Alternative schlage ich vor:
Java:
HashMap<String,String> invertedListsInt = new HashMap<String,String>();
if (!invertedListsInt.containsKey(word)) {
    invertedListsInt.put(word, "");
}
invertedListsInt.put(word,invertedListsInt.get(word)+" "+documentId);
 

DrZoidberg

Top Contributor
Ich schlage vor du verwendest diese Klasse anstelle von ArrayList.

Java:
class IntList {
    private int[] array = new int[10];
    private int size = 0;
    
    private void grow() {
        int[] newArray = new int[(array.length * 3)/2];
        for(int i = 0; i < size; i++) {
            newArray[i] = array[i];
        }
        array = newArray;
    }
    
    public void add(int n) {
        if(size == array.length-1) grow();
        array[size++] = n;
    }
    
    public int get(int i) {
        return array[i];
    }
    
    public int size() {
        return size;
    }
}
 

japa

Aktives Mitglied
:toll:

Ok Danke, jetzt ist alles geklärt, ich wusste nicht, dass Integer so viele Speicher verbraucht, ich habe gezählt, es kam ca. 42 000 000 Integer Objekte raus -.-

Ich hätte noch eine Nebenfrage, wie kann ich den Speicherverbrauch eines Objekt herausfinden?

Danke noch mal für eure Hilfe.
 

ARadauer

Top Contributor
du hältst ja die daten im speicher, gib java mehr speicher "Extend java heap space" usw... wozu haben wir rechner mit 8GB aufwärts wenn wir dann der jvm nur 256 mb geben...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Socket.setSoTimeout -> BufferedReader -> Default value Allgemeine Java-Themen 4
kodela Unterschiedliches Verhalten von BufferedReader Allgemeine Java-Themen 3
D BufferedReader bricht nach 1248 Iterationen ab Allgemeine Java-Themen 14
C BufferedReader/BufferedWriter schreibt nicht alle Bytes Allgemeine Java-Themen 2
C TCP Server und BufferedReader Leerstring im Stream? Allgemeine Java-Themen 5
A BufferedReader ohne System.in Allgemeine Java-Themen 9
J BufferedReader Datei einlesen Allgemeine Java-Themen 8
Messoras Der BufferedReader mag mich nicht Allgemeine Java-Themen 47
C Threading mit BufferedReader/InputStream & sockets Allgemeine Java-Themen 0
B Input/Output BufferedReader Allgemeine Java-Themen 3
O BufferedReader von ganz unten anfangen zu lesen Allgemeine Java-Themen 7
S BufferedReader/PrintWriter an einer HTML Allgemeine Java-Themen 6
M BufferedReader: Vom Logfile zur Datenbank Allgemeine Java-Themen 6
S Null Pointer Exception bei BufferedReader Allgemeine Java-Themen 4
K BufferedReader.readLine erkennt Zeilenende nicht Allgemeine Java-Themen 11
D 'InputStreamReader' & 'BufferedReader' führen zu "cannot find symbol"-Fehler Allgemeine Java-Themen 3
D Scanner leer aber bufferedReader nicht?! Allgemeine Java-Themen 2
A bufferedReader readline, encoding Allgemeine Java-Themen 5
V wie bufferedreader.readline() unterbrechen? Allgemeine Java-Themen 4
Developer_X Java BufferedReader mit URL Allgemeine Java-Themen 5
D BufferedREader#readLine Allgemeine Java-Themen 20
Semox Fehler - Zuweisung aus BufferedReader an Variable Allgemeine Java-Themen 3
S Exception beim BufferedReader Allgemeine Java-Themen 3
J BufferedReader br.readLine(); Allgemeine Java-Themen 22
G getFilePointer in BufferedReader? Allgemeine Java-Themen 2
D (BufferedReader) inLine() "verschluckt" zeilen ? Allgemeine Java-Themen 2
M BufferedReader.read(char[] cbuf) liefert falsche Werte? Allgemeine Java-Themen 4
W Frage zu BufferedReader Allgemeine Java-Themen 2
conan2 BufferedReader.readLine() von anderem Thread aus beenden Allgemeine Java-Themen 4
K Wie kann ich einen BufferedReader beschleunigen? Allgemeine Java-Themen 4
N readLine() von BufferedReader hält das Programm fest/auf! Allgemeine Java-Themen 10
B while mit BufferedReader beenden Allgemeine Java-Themen 5
F Zu große Werte beim byteweisen Lesen mit BufferedReader.read Allgemeine Java-Themen 5
S BufferedReader problem Allgemeine Java-Themen 11
D BufferedReader in image umwandeln Allgemeine Java-Themen 3
M BufferedReader input - hängt sich auf Allgemeine Java-Themen 4
C Probleme mit URL und BufferedReader Allgemeine Java-Themen 6
C BufferedReader oder DataInputStream Allgemeine Java-Themen 4
M Store a String in a BufferedReader Allgemeine Java-Themen 2
C Eclipse OutOfMemory nach dem exportieren Allgemeine Java-Themen 4
A Interpreter-Fehler OutOfMemory Exception mit Base64 decode Allgemeine Java-Themen 3
K Input/Output ObjectInputStream.HandleTable OutOfMemory Allgemeine Java-Themen 8
N OutOfMemory Allgemeine Java-Themen 5
G OutOfMemory Error bei Zahlenkonvertierungsprogramm Allgemeine Java-Themen 5
B Java OutOfMemory Error verhindern, Resourcenbedarf präventiv abschätzen? Allgemeine Java-Themen 19
M OutOfMemory Exception? Allgemeine Java-Themen 12
N OutOfMemory nur wenn -Xmx gesetzt ist?! Allgemeine Java-Themen 6
E java.lang.outofmemory über windows-cmd ändern Allgemeine Java-Themen 6
R Speicherprobleme (OutOfMemory Error) Allgemeine Java-Themen 26
V JVM OutofMemory Linux geht, windows nicht Allgemeine Java-Themen 3
H java heap space (outofmemory error) Allgemeine Java-Themen 3
J ObjectInputStream und OutOfMemory Allgemeine Java-Themen 10
K OutOfMemory beim Entzippen Allgemeine Java-Themen 6
N Kann ich die Nullpointer Exception umgehen Allgemeine Java-Themen 12
K Factory Pattern: Mit Generics umgehen Allgemeine Java-Themen 6
F SecurityException umgehen Allgemeine Java-Themen 3
P Rhino - wie mit NativeJavaObject umgehen? Allgemeine Java-Themen 2
M Wie umgehen mit Lizenzen Allgemeine Java-Themen 11
M Umgehen der fehlenden friends Deklaration Allgemeine Java-Themen 2
N xml fatal error umgehen Allgemeine Java-Themen 14
F Umgehen mit übergebenen Streams Allgemeine Java-Themen 3
M Geschützte Systemdateien sinnvoll umgehen bei listFiles() Allgemeine Java-Themen 7
F eclipse - Warnung für ganze Klasse umgehen Allgemeine Java-Themen 2
P Optimierung (&& ||) deaktivieren / umgehen? Allgemeine Java-Themen 9
Z mit java htaccess - abfrage bestätigen/umgehen Allgemeine Java-Themen 2
M Generics - besser programmieren, Warnung umgehen Allgemeine Java-Themen 4
M Thread.stop() umgehen ? Allgemeine Java-Themen 2
D Casting umgehen Allgemeine Java-Themen 2
Luma Trick zum Umgehen einer Performancefalle? Allgemeine Java-Themen 6
S static umgehen Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben