Einlesen in Array von Textdatei sehr langsam

coldABI

Mitglied
Hallo liebe Experten,

ich möchte mit einer Methode den Inhalt einer Textdatei (String) in ein zweidimensionales Array einlesen. Die Textdatei umfasst ca. 15 Mio. Zeilen mit jeweils 4 Werten.

Die ersten 5 Mio. Zeilen werden auch ohne Probleme eingelesen, ab da wird dann nunr noch im Sekundentakt eine Zeile eingelesen, sodass ich wahrscheinlich Monate warten müsste, bis in das Array vollständig eingelesen ist.

Unten aufgeführt der entsprechende Code.

Java:
    public static String[][] readData(String dateiname) {      
        
        String[][] gesamt;
        gesamt = new String[15025970][4];
        
        try {
        
        File fl;
        fl = new File(dateiname);
        
        FileReader fr;
        fr = new FileReader(fl);
        
        BufferedReader br;
        br = new BufferedReader(fr);
        
        String zeile = br.readLine();
        
        int i = 0;
        
            while(zeile != null) {
            
                String[] verbund = zeile.split("\t");
            
                String wert1 = verbund[0];
                String wert2 = verbund[1];
                String wert3 = wert1+wert2;
                String wert4 = verbund[2];
                String wert5 = verbund[3];
                    
                gesamt[i][0] = wert3;
                gesamt[i][1] = wert4;
                gesamt[i][2] = wert5;
                gesamt[i][3] = "0";

                i = i+1;
                
                System.out.println(i);
                
                zeile = br.readLine();
            }       
        }
        
        catch(FileNotFoundException e1) {
            System.out.println(e1);
        }
        
        catch(IOException e2) {
            System.out.println(e2);
        }
        
        return gesamt;
        
    }

Gibt es eine Möglichkeit das Einlesen zu beschleunigen (andere Vorgehensweise, Optimierung des Codes)?


Danke im Voraus.


Viele Grüße

Stefan
 
Zuletzt bearbeitet:
also ich würde in Anbetracht der Menge und der Sinnhaftigkeit des Erstellens neuer Objekte das erstmal wie folgt abändern:
Java:
while(zeile != null) {
           
                String[] verbund = zeile.split("\t");
           
                String wert1 = verbund[0];
                String wert2 = verbund[1];
                String wert3 = wert1+wert2;
                String wert4 = verbund[2];
                String wert5 = verbund[3];
                   
                gesamt[i][0] = wert3;
                gesamt[i][1] = wert4;
                gesamt[i][2] = wert5;
                gesamt[i][3] = "0";
 
                i = i+1;
               
                System.out.println(i);
               
                zeile = br.readLine();
            }      
        }

zu
Java:
String[] verbund;
while(zeile != null) {
           
                verbund = zeile.split("\t");
                   
                gesamt[i][0] = verbund[0]+verbund[1];
                gesamt[i][1] = verbund[2];
                gesamt[i][2] = verbund[3];
                gesamt[i][3] = "0";
 
                i = i+1;
               
                System.out.println(i);               
                zeile = br.readLine();
            }      
        }
 
Hallo,

das ist auf alle Fälle besser, als 60 Mio. Objekte zu erzeugen. Dennoch geht die Geschwindigkeit ab ca. 5 Mio. Zeilen rasant nach unten, sodass man nur noch abbrechen kann.

Gibt es noch andere Möglichkeiten?


Danke und viele Grüße

Stefan
 
Also dein Programm braucht bei mir erst mal 5 sekunden, um das Array zu erzeugen 🙂

Aber dann geht es eigentlich, ab zeile 7000000 schafft es etwa 100000 pro Sekunde
 
ok, nach öfteren versuchen hat sich herausgestellt, dass das programm in etwa ab zeile 6.000.000 alle 500.000 zeile hängt.

Das liegt dann warscheinlich an der Festplatte
 
Ich habe es wie folgt geändert. Nun wird es erfolgreich eingelesen. Er braucht bei Zeile 14.000.000 ca. 8 Sekunden für 10.000 Zeilen. Das ist aber voll im Rahmen.

Danke für die Antworten!

Java:
while(zeile != null) {
            
                String[] verbund = zeile.split("\t");
                
                String wert3 = verbund[0]+verbund[1];
                String wert4 = verbund[2];
                String wert5 = verbund[3];
                    
                gesamt[i][0] = wert3.intern();
                gesamt[i][1] = wert4.intern();
                gesamt[i][2] = wert5.intern();

                i = i+1;
                
                System.out.println(i);
                
                zeile = br.readLine();
            }
 
Die hohe Anzahl an System.out.println() verlangsamt das Ganze. Zudem solltest du schon im Vorfeld für dein Programm mehr RAM reservieren: -Xmx2048m 😉
 
Vielen Dank für den Tipp. Da hab ich mir doch den Zähler ausgegeben, um das Problem zu beheben, habe es aber damit erst erzeugt. 🙂

Zusammen mit der Reservierung von mehr Speicher, werden die Werte nun in ca. 2 Minuten eingelesen.


Vielen Dank noch einmal.
 

Zurück
Oben