Teile großer Datei effektiv einlesen
Hallo Community,
ich hab da ein Problem, bei dem ich eure Hilfe benötige. Ich soll ein Programm schreiben, welches bestimmte Teile einer großen XML-Datei (2GB und größer) möglichst schnell einliest.
Gegeben ist die Anfangs- und die Endzeile des Ausschnitts und die Datei selbst natürlich, mehr nicht.
Ich habe es zunächst mit dem Scanner probiert, für eine 2GB große Datei (ca. 43.000.000 Zeilen) hat er im Schnitt 80s gebraucht, ist also viel zu langsam(für die Tests habe ich immer den schlechtesten Fall angenommen: Der gesuchte Ausschnitt besteht aus den letzten 5 Zeilen der Datei. Danach kam der BufferedReader zum Einsatz:
Diese Methode braucht auf meinem Rechner im Schnitt ca. 30s, schon schneller als der Scanner, aber trotzdem zu langsam, weil die Dateien auch 10GB groß sein können.
Leider habe ich im Internet nicht viel über das performante Einlesen der Dateien gefunden. Hier im Forum habe ich über die Klasse RandomAccessFile gelesen, ist zwar interessant, für mich aber unbrauchbar, ich kenne nur die Zeilennummer.
Vielleicht kennt hier jemand andere Möglichkeiten, die mein Problem schneller lösen können.
Ich hoffe, ihr könnt mir helfen und bedanke mich schon im Voraus!
Gruß
Stan
P.S.: Falls es relevant sein sollte, mein Rechner:
Hallo Community,
ich hab da ein Problem, bei dem ich eure Hilfe benötige. Ich soll ein Programm schreiben, welches bestimmte Teile einer großen XML-Datei (2GB und größer) möglichst schnell einliest.
Gegeben ist die Anfangs- und die Endzeile des Ausschnitts und die Datei selbst natürlich, mehr nicht.
Ich habe es zunächst mit dem Scanner probiert, für eine 2GB große Datei (ca. 43.000.000 Zeilen) hat er im Schnitt 80s gebraucht, ist also viel zu langsam(für die Tests habe ich immer den schlechtesten Fall angenommen: Der gesuchte Ausschnitt besteht aus den letzten 5 Zeilen der Datei. Danach kam der BufferedReader zum Einsatz:
Java:
public void read( long firstLine, long lastLine ) {
long lineCount = 0;
String line;
StringBuffer buffer = new StringBuffer();
try {
BufferedReader bufferedReader = new BufferedReader( new FileReader( "C:\\largefile.xml" ));
try {
while ( lineCount < lastLine && ( line = bufferedReader.readLine() ) != null ) {
if ( lineCount >= firstLine ) {
buffer.append( line + "\r\n" );
}
lineCount++;
}
} finally {
bufferedReader.close();
}
} catch ( IOException e ) {
e.printStackTrace();
}
System.out.println( buffer.toString() );
}
Leider habe ich im Internet nicht viel über das performante Einlesen der Dateien gefunden. Hier im Forum habe ich über die Klasse RandomAccessFile gelesen, ist zwar interessant, für mich aber unbrauchbar, ich kenne nur die Zeilennummer.
Vielleicht kennt hier jemand andere Möglichkeiten, die mein Problem schneller lösen können.
Ich hoffe, ihr könnt mir helfen und bedanke mich schon im Voraus!
Gruß
Stan
P.S.: Falls es relevant sein sollte, mein Rechner:
- Win 7 64Bit
- 3 GB RAM
- intel core 2 @ 2,4GHz
Zuletzt bearbeitet: