Große .txt einlesen - Idee?

Java4Life

Mitglied
Hi,
ich wollte ein Programm schreiben,dass eine sehr,sehr große .txt einliest (zeilenweise). Auf die Zeilen einen regex anwendet und dann eine neue Datei mit der Ausgabe schreibt...

Wie gesagt ist das Problem die größe der Datei...Bei kleineren funktioniert der Algorithmus 1a. Wenn ich aber die eigentlichen,großen Dateien einlesen will, dann wird anscheinend die Datei nicht vollständig geladen.
Die Dateien sind ca. 1 - 1,5 GB groß! Arbeitsspeicher ist ausreichend vorhanden (3,5 gb) und wird auch nicht voll ausgelastet.

Hier noch ein kleiner "prinzipieller" Codeausschnitt:

Java:
FileReader fr = new FileReader(chooser.getSelectedFile());
			BufferedReader br = new BufferedReader(fr);
			String s;
			while((s = br.readLine()) != null) {
				//schreibe 
		}
			fr.close();

Hat jemand eine Idee,ob man eventuell die Datei besser puffern kann bzw. wie vielleicht erfahrende Programmierer bei sowas vorgehen? Ich meine, bei Tools wie UltraEdit geht es ja auch...Aber eigentlich dürfte es ja kein Problem sein,dass durch Java alles über die VM geht -oder?
Oder sind Threads die Lösung?

Bin für alle Ideen dankbar :toll:
 
Also ist jetzt nur ein Schuss ins Blaue von mir (hab schon zu lang nix mit Java gemacht). Aber könnts vielleicht am garbage collector liegen, weil s ein String ist und bei jeder neuen Zuweisung ein neues Objekt angelegt(?) wird? Eventuell einfahc mal mit nem StringBuilder versuchen ... aber wie gesagt ... lange Java Pause, könnt auch totaler Stuss sein.
 
Das merke ich daran,dass er aus einer 1 GB Datei eine paar hundert kilobyte große .txt macht. Und mein Algo ist richtig - das weiß ich (klappt ja schließlich mit kleineren Dateien) ^^

Kurzgefasst:
normale Datei (10 mb oder so) --> alles gut (es wurde erfolgreich eine neue aussortierte Datei erstellt:9mb)

große Datei (1 gb) --> wird eine Datei erstellt (dort verschluckt er Wörter bzw. erstellt eine 400kb Datei)

Hat denn jemand zufällig schon Erfahrungen im Zusammenhang mit der Verarbeitung von sehr großen Dateien (1GB +) gehabt?

Und Festplatte/RAM ist auch ausreichend vorhanden.
 
Zuletzt bearbeitet:
Das irgendwas verschluckt wird, kann eigentlich nicht sein. BufferedReader ist eigentlich ausreichend. Sieh auch FileChannel
 
mein Writer sieht ungefähr so aus:

Java:
FileWriter write = new FileWriter("ausgabe.txt");

FileReader fr = new FileReader(chooser.getSelectedFile());
		BufferedReader br = new BufferedReader(fr);

String s;
while((s = br.readLine()) != null) {
	
      if (//das entspricht dem pattern){
           write.append(s + "\n");
     }
		}
write.close();
fr.close();
 
Java:
new FileWriter("ausgabe.txt", true);
du musst ihm auch sagen, dass er der datei was anhängen soll und nicht immer eine neue erstellen soll

Seh gerade ist wohl doch der falsche Ansatz gewesen
 
Zuletzt bearbeitet:
Hallo,

ist jetzt vielleicht eine blöde Frage, aber warum verwendest du für das Schreiben nicht die Methode .write(), sondern .append()?

Ansonsten würde ich auch wie bone2 ein .flush() nach dem Schreiben empfehlen.

MfG
hansmueller
 
Frage: Warum benutzt du keinen BufferedWriter?

Auszug aus FileWriter:
public class FileWriter
extends OutputStreamWriter

Convenience class for writing character files. The constructors of this class assume that the default character encoding and the default byte-buffer size are acceptable. To specify these values yourself, construct an OutputStreamWriter on a FileOutputStream.

[...]

FileWriter is meant for writing streams of characters. For writing streams of raw bytes, consider using a FileOutputStream.

das aus BufferedWriter:
Write text to a character-output stream, buffering characters so as to provide for the efficient writing of single characters, arrays, and strings.

The buffer size may be specified, or the default size may be accepted. The default is large enough for most purposes. [...]

Ich denke genau da liegt der Hase begraben, am Buffer.
 
die methode write dürfte alles in der datei löschen. die methode append jedoch hängt alle strings an (wie es auch sein soll).
man könnte jedoch (glaube ich) "append" ohne \n schreiben...

genau nach so etwas habe ich gesucht bzw. es vermutet, dass es mit dem buffer zusammenhängt...
werde es bei gelegenheit mal einbauen und meine erkenntnisse hier posten.

danköö
 
Zuletzt bearbeitet:
Hallo,

Java4Life hat gesagt.:
die methode write dürfte alles in der datei löschen.
Sollte eigendlich nicht passieren, solange du den Stream nicht schließt.

Hier mal ein kleines exemplarisches Beispiel, wie man das mit den BufferedWriter machen könnte:
Java:
			y = new File("DeineDatei");
			Dateischreiben = new FileWriter(y);
			Datenoutput = new BufferedWriter(Dateischreiben);
			
			while(DeineBedingung)
			{
				//Hier irgendwas machen.				
										
				Datenoutput.write(Hier_kommt_deine_zu_schreibende_Zeile_rein);
				Datenoutput.newLine();//Zeilenumbruch speziell für das verwendete Betriebsystem
				Datenoutput.flush();//Würde ich mal ausprobieren.
			}					
			
			Datenoutput.close();
			Dateischreiben.close();

MfG
hansmueller
 
ok,hier nochmal kurz feedback...

tatsächlich scheint der BufferedWriter tadellos zu funktionieren. (auch ohne das von vielen "gehasste" flush) ^^

Auf jeden Fall nochmal ein Danke an alle!!!!
 

Zurück
Oben