Text Datei einlesen

qtuan3008

Mitglied
Hallo liebe Mitprogrammierer.

Ich habe eine Textdatei ca. 500MB, 12.000.000 Zeile
Zum Einlesen benutze ich BufferedReader

Java:
public void doctext_Seite_Redirect() {
		String line = "";
		int count =0;
		try {
			BufferedReader reader = new BufferedReader(new FileReader(
					"..........."));
			while (line != null) {
				count++;
				line = reader.readLine();
			}			
			System.out.println(count);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

Das Problem ist: der Programm läuft langsam 12min aber noch nicht fertig. Gibt vielleicht andere Lösung außer BufferedReader zum Einlesen?

Viele Grüsse
Tuan
 
S

SlaterB

Gast
hast du den Code exakt so?
oder machst du mit der Linie noch etwas, wenn du alle Strings mit + zusammenaddierst kann es unendlich langsam werden,
für jede einzelne Zeile müssen dann hunderte MB im Speicher neu beschrieben werden (Lösung: StringBuilder)
anderenfalls sollte es ganz fix gehen,

hier ein Testprogramm:
erzeugt sich die Datei gar selber, schreibt aktuell 5 Mio. Zeilen = 90 MB, das dauert bei mir 5.5 sec,
liest danach diese 5 Mio. Zeilen in 1.5 Sekunden ein,

wenn das Testprogramm bei dir ähnlich schnell ist, dann macht dein restlicher Code irgendwas anders,
wenn auch langsam, dann besteht wirklich ein Problem

Java:
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        File f = new File("test.txt");
        long time = System.currentTimeMillis();
        int max = 1000000 * 5;
        String line = "Hallo Hallo Hallo\n";
        BufferedWriter b = new BufferedWriter(new FileWriter(f));
        for (int i = 0; i < max; i++)
        {
            b.write(line);
        }
        b.close();
        System.out.println("file size: " + f.length() + ", time: " + (System.currentTimeMillis() - time));

        int count = 0;
        BufferedReader reader = new BufferedReader(new FileReader(f));
        while (line != null)
        {
            count++;
            line = reader.readLine();
        }
        System.out.println(count + ", time: " + (System.currentTimeMillis() - time));
        reader.close();
    }
}
 
Zuletzt bearbeitet von einem Moderator:

qtuan3008

Mitglied
danke für schnellen Antwort.
Ich habe deine Code probiert aber mit langem String. Es ist klar langsamer. Gibt vielleicht andere Methode außer BufferedReader. Wenn nicht, dann muss ich damit leben.
 
S

SlaterB

Gast
welche Zeiten ergeben sich denn wenn du mein Programm unverändert ausführst?

was bedeutet
> aber mit langem String. Es ist klar langsamer.
ganz konkret?

hast du schon eine fertige Zeit gemessen für deine lange Datei?
ist die Zeit linear, brauchst du also für eine 250 MB-Datei, falls vorhanden, genau die halbe Zeit oder zufällig 1/4?
wenn alles zu lang zum Testen ist dann mit kleinen Dateien anfangen, 1 KB, 1 MB, 2 MB usw.

eine Alternative ist vielleicht nio statt io:
Example Depot | Useful code samples
aber ich persönlich kann mir nicht vorstellen, dass es am BufferedReader liegt
 
Zuletzt bearbeitet von einem Moderator:

qtuan3008

Mitglied
ich meine bei dir du hast mit dem String = "Hallo Hallo Hallo\n" probiert. ich habe mit String = "Hallo Hallo Hallo Hallo Hallo HalloHallo Hallo HalloHallo Hallo HalloHallo Hallo Hallo" probiert und ist langsamer. Das ist Normal oder wenn das String länge ist
Was ich euch fragen möchte gibt andere Methode zum Einlesen die schneller als Bufferreader funktioniert? Wenn nicht dann kann ich nicht anders machen.
 
Zuletzt bearbeitet:
S

SlaterB

Gast
ich hab mein Posting bisschen editiert, deshalb nochmal ein Hinweis darauf falls du den nio-Link nicht gesehen habe,

da du mit 'langsamer' weiter spekulativ bleibst erlaube ich mir auch dazu nochmal eine Bemerkung:
klar wird das ganze deutlich langsamer wenn der String länger wird, die Datei dann auch z.B. 300 MB statt 90 MB belegt,
bei mir dauert das Einlesen dann auch schon mal 10 sec statt 2 sec oder ähnliches,
aber das ist ja überhaupt kein Problem, mehr als 50-100 MB pro Sekunde sollte man nicht annehmen,
und von deinen 12 Min. sind das noch Welten entfernt,
selbst das Betriebssystem braucht zum Kopieren einer derartigen Datei paar Sekunden, und wenn Java das noch alles in den Speicher laden sowie Millionen String-Objekte erzeugen soll..

> ich habe mit String = "Hallo Hallo Hallo Hallo Hallo HalloHallo Hallo HalloHallo Hallo HalloHallo Hallo Hallo" probiert

solltest du keinen Zeilenumbruch, also insgesamt nur eine Zeile haben, kann das vielleicht Probleme machen, teste ich jetzt noch,
bzw. kann ich gar nicht ohne erst noch den Speicher zu erhöhen usw., hast du daran gedacht?
vorher sprachst du ja von Millionen Zeilen, nicht von EINER..
 
Zuletzt bearbeitet von einem Moderator:

qtuan3008

Mitglied
Ich habe hier die Datei die ist leide in .bz2 kompriemiert. Kannst du vielleicht probieren wie lange bei dir dauert (nur zum einlesen)
 
Zuletzt bearbeitet:

qtuan3008

Mitglied
Ich habe eine Datei 72mb probiert, dauert 5 min denke für 500mb 40 min.
Ich denke ich muss mit Bufferreader leben. Und den Rechner Warten. trotzdem danke für deine Hilfe.
 
Zuletzt bearbeitet:
S

SlaterB

Gast
mir unverständlich dass du so früh und unkoordiniert aufgibst,
du müsstest mein Programm nur kopieren und ausführen,
wenn dass dann auch lange dauert (genau zu unterscheiden zwischen Speichern und Laden),
dann wäre das ein Phänomen was ich bisher nicht gesehen habe, also für sich bemerkenswert,

wenn es dagegen schnell geht, dann bestände ja ein Ausgangspunkt um den Rest weiter zu erforschen,
dann würde ich vielleicht auch die Datei laden und anderes, aber du machst nicht mit, na dann eben nicht
 

Dit_

Bekanntes Mitglied
ich glaube es dauert bei dir so lange wegen
Code:
System.out.println(count);
 
S

SlaterB

Gast
ist das eine Spaßmeldung oder willst du das noch erläutern?
 
Zuletzt bearbeitet von einem Moderator:

qtuan3008

Mitglied
@Dit:wegen
Java:
System.out.println(count);
bestimmt nicht
@SlaterB: danke für deine Mühe. Ich lasse mein Programm jetzt laufen. Ich denke der läuft langsam weil die Zeile von mir sind lang z.b: "Government of the Northern Territory||||Local Government Areas of the Northern Territory".
 
S

SlaterB

Gast
wie du meinst, für die Allgemeinwelt gilt aber:
auch lange Zeilen (im Sinne von < 1000 Zeichen, nicht > 1 Mio..) ändern nichts,
mein Programm mit
Java:
        int max = 1000000 * 2;
        String line = "Hallo Hallo Hallo Hallo Hallo HalloHallo Hallo HalloHallo Hallo HalloHallo Hallo HalloHallo Hallo HalloHallo Hallo HalloHallo Hallo HalloHallo Hallo HalloHallo Hallo HalloHallo Hallo Hallo\n";
(zu beachten ist der Zeilenumbruch am Ende)

erstellt eine 380 MB-Datei, die in 5 sec eingelesen ist
 

qtuan3008

Mitglied
Ich habe mit deinem String probiert. Und der Rechner ergibt
file size: 378000000, time: 39791
2000001, time: 76984
also 76s zum einlesen.
Ich benutzer eclipse. Prozessor 2.5ghz
Kann sein dass ich in eclipse etwas konfiguieren muss?

Java:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;

public class test {
	public static void main(String[] args) throws Exception {
		File f = new File("test.txt");
		long time = System.currentTimeMillis();
		 int max = 1000000 * 2;
	        String line = "Hallo Hallo Hallo Hallo Hallo HalloHallo Hallo HalloHallo Hallo HalloHallo Hallo HalloHallo Hallo HalloHallo Hallo HalloHallo Hallo HalloHallo Hallo HalloHallo Hallo HalloHallo Hallo Hallo\n";
		BufferedWriter b = new BufferedWriter(new FileWriter(f));
		for (int i = 0; i < max; i++) {
			b.write(line);
		}
		b.close();
		System.out.println("file size: " + f.length() + ", time: "
				+ (System.currentTimeMillis() - time));

		int count = 0;
		BufferedReader reader = new BufferedReader(new FileReader(f));
		while (line != null) {
			count++;
			line = reader.readLine();
		}
		System.out.println(count + ", time: "
				+ (System.currentTimeMillis() - time));
		reader.close();
	}

}
 
Zuletzt bearbeitet:
S

SlaterB

Gast
da die ersten 40 sec fürs Schreiben sind brauchst du nur 37 sec zum Lesen,
das ist nochmal die Häfte weniger, aber immer noch erstaunlich mehr als bei mir,

dennoch würde ich über diesen Wert gar nicht aufregen, das ist doch schon toll gegenüber 12 Min. oder noch längere unbekannte Zeit,
da muss man eigentlich auch nicht groß was untersuchen (ok, nicht zuletzt weil mir eh kaum was einfällt ;) )

lasse das Schreiben weg und gib den Pfad zu deiner 500 MB-Datei an, die sollte doch in diesem Programm in 1-2 Min geschafft werden?
ein kleiner Zusatz ist noch eine Ausgabe während der Schleife, z.B.
Java:
            if (count % 100000 == 0) System.out.println(count + ", time: " + 
                     (System.currentTimeMillis() - time) + ", running");


---------

wie schnell geht eigentlich das Kopieren der Datei im Explorer, falls Windows?
gibt es Virenscanner, Firewall oder irgendwas vom Betriebssystem zu bedenken?
zufällig von einer USB-Festplatte gelesen?..
 

qtuan3008

Mitglied
Ich habe auch nicht verstanden warum gibt den Unterschied 5s vs 40s. Oder dein Rechner ist stark??????
"lasse das Schreiben weg und gib den Pfad zu deiner 500 MB-Datei an" Ich habe nicht wirklich verstanden was du gemeint hast. Meinst du es kann liegen an den Pfad.
 
S

SlaterB

Gast
die 5 zu 40 sec kann ich bisher auch nicht erklären, finde sie aber wie gesagt weitaus besser als 40 sec zu 40 Min.,

am Pfad liegt es eher nicht, sondern du sollst dieses Programm nun mit deiner 500 MB-Datei testen, ob diese immer noch 40 Min. braucht oder hier schneller geht,
dabei dann den Anfang mit Schreiben einer Datei offensichtlich weglassen
 

qtuan3008

Mitglied
Ja ich habe schon getestet. Ich habe nicht bis 40min gewartet sondern 10min. Hast du meine Datei probiert. Die ist nur text datei, mehr nicht also brauchst du keine sorge.

Wenn wir keine Lösung finden können, kann du mir bescheid sagen, dann werde ich das Thema erledigen.
Und ich muss dir noch mal danke für deine Mühe
 
Zuletzt bearbeitet:

qtuan3008

Mitglied
Ich denke es hängt an dem Rechner ab, java, eclipse. Ich benutze momentan den Rechner von der uni. Der ist relativ schnell aber kann sein dass der alte java hat.
 

Andi_CH

Top Contributor
Vergiss "schnelle" Rechner - die schnellste CPU wird ausgebremst, wenn die Kiste zu wenig Memory hat und swappt.
Altes Java? Dann hol dir doch das Neue - das kann man IMO auch als gewöhnlicher User irgenwohin kopieren und dann dem Eclipse sagen, dass es das verwenden soll (Ist allerdings mehr Erinnerung als Wissen)
 

qtuan3008

Mitglied
der Rechner ist von der uni Speicher 8gb Swap 4gb

Ich habe gerade probiert mit meinem Laptop

Code:
file size: 378000000, time: 8348
2000001, time: 13265

???:L???:L???:L???:L
 
Zuletzt bearbeitet von einem Moderator:

Dit_

Bekanntes Mitglied
ist das eine Spaßmeldung oder willst du das noch erläutern?

nein, bloß Quatsch... habs übersehen dass die Anweisung außerhalb der while schleife ist...

@qtuan3008
axoooooo dann hast du bestimmt eine Netzwerkfestplatte...

Detailierte SystemInformationen könnte man gleich am Anfang posten :p

:oops:
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Datei als ASCII text einlesen ? Allgemeine Java-Themen 16
G HTML-Datei einlesen, Plain Text in Textfile speichern Allgemeine Java-Themen 4
J Text einer .csv Datei einlesen und Zeile in NEUE Zeile hänge Allgemeine Java-Themen 1
J Die Letzte Zahl aus einer Text datei lesen Allgemeine Java-Themen 8
N Das Ende von bestimmten zeilen in text datei ändern und speichern Allgemeine Java-Themen 3
X Löschen von einer Zeile in einer Text Datei. Klappt nicht. Allgemeine Java-Themen 4
J Java - Zeile aus Text datei löschen Allgemeine Java-Themen 13
W Arraylist Text Suchen und Datei löschen Allgemeine Java-Themen 5
M Text datei in java jar datei einbinden Allgemeine Java-Themen 4
lumo encoding einer text-datei Allgemeine Java-Themen 2
martin82 Java-Code aus Text-Datei parsen Allgemeine Java-Themen 3
S Text in Datei speichern Allgemeine Java-Themen 6
E Doppelten Text in Datei finden? Allgemeine Java-Themen 11
K Text-Datei auslesen Allgemeine Java-Themen 3
B Text Datei zu array2d[][] Allgemeine Java-Themen 9
S Text in eine txt-Datei schreiben und abspeichern! Allgemeine Java-Themen 8
G ResultSet in Text-Datei speichern Allgemeine Java-Themen 4
S Text an einer beliebigen Stelle in eine Datei anfügen Allgemeine Java-Themen 8
S Text aus Datei lesen und zurückschreiben Allgemeine Java-Themen 6
G Einer Datei Text hinzufügen Allgemeine Java-Themen 4
O Text aus einer Textdatei rausholen, der zwischen zwei Schlüsselworten steht Allgemeine Java-Themen 4
K Bildschirm auslesen/ Text erkennen Allgemeine Java-Themen 5
berserkerdq2 Text über einen Shape anzeigen (Scenebuilder) Allgemeine Java-Themen 1
M Thymeleaf th value und th text Allgemeine Java-Themen 1
_user_q Eingegebenen Text Zeile für Zeile ausgeben lassen Allgemeine Java-Themen 11
_user_q Eingegebenen Text wiederholt schreiben lassen Allgemeine Java-Themen 9
G Darstellung von Text auf MapContext von GeoTools Allgemeine Java-Themen 2
Alex_99 Programm stürzt beim Aufruf der Funktion ab? Text ausgeben Allgemeine Java-Themen 45
Mozart53 JLabel nur meinen Text verschieben ohne Image Allgemeine Java-Themen 3
izoards Bestimmter Text aus PDF extrahieren Allgemeine Java-Themen 3
B Scanner erkennt keinen Text in Textdatei, obwohl welcher drinsteht Allgemeine Java-Themen 10
K HTMLEditor HTML Text in Rich Text umwandeln Allgemeine Java-Themen 14
kodela JDialog zeigt Text nicht an Allgemeine Java-Themen 5
L Text filtern Allgemeine Java-Themen 1
Bluedaishi TEXT Kodierung Allgemeine Java-Themen 3
S Ini Text aus String parsen Allgemeine Java-Themen 1
M itext - Button der Text in Zwischenablage stellt Allgemeine Java-Themen 0
E CSV mit Text und Binärdaten auslesen Allgemeine Java-Themen 7
FRI3ND Datentypen Date-Array sortieren - Text mitnehmen? Allgemeine Java-Themen 7
I Text suchen und ersetzen im Word Dokument Allgemeine Java-Themen 3
windl Text mining / deep learning Allgemeine Java-Themen 0
I Text aus Input-Box entnehmen und zuweisen Allgemeine Java-Themen 1
KeexZDeveoper Text Mining Allgemeine Java-Themen 3
L Input/Output Wie kann man in der Konsole einen Text farbig ausgeben z.b in grün Allgemeine Java-Themen 6
B Arrays mit Text und Zahlen füllen Allgemeine Java-Themen 3
A Datenexport (Text und Draw) Allgemeine Java-Themen 1
L Text von txt auf JTextArea Allgemeine Java-Themen 4
A 2D-Grafik Text in ein Bild schreiben Allgemeine Java-Themen 11
T Textarea text wird immer überschrieben Allgemeine Java-Themen 4
I Apache POI Word Text einfügen Allgemeine Java-Themen 26
T itext: text in ein textfeld hinzufügen Allgemeine Java-Themen 2
B Farbiger Text in der Konsole Allgemeine Java-Themen 1
K Pdf mit dynamischem Text mit iText Allgemeine Java-Themen 0
D Text Analyzer Allgemeine Java-Themen 2
RalleYTN Audiodatein(.ogg/.wav) in Text konvertieren Allgemeine Java-Themen 0
L Nach Button drücken den Text festspeichern Allgemeine Java-Themen 9
J Text lesen und in Variablen speichern Allgemeine Java-Themen 3
S Text in mehreren Sprachen korrekt darstellen? Wie waehle ich die Fonts aus..? Allgemeine Java-Themen 0
M Text in erstelltes Excelfile schreiben Allgemeine Java-Themen 6
N Input/Output Website Text auslesen und bestimmte Zeilen wiedergeben Allgemeine Java-Themen 4
P HTML Text bearbeiten Allgemeine Java-Themen 1
B JFrame Text Ausgabe Allgemeine Java-Themen 7
G Makierter Text in Arbeitsspeicher Allgemeine Java-Themen 2
B Text in die Mitte der Konsole schreiben. Allgemeine Java-Themen 1
M Variablen Variablen in Text einbinden Allgemeine Java-Themen 5
P iText Text zentrieren Allgemeine Java-Themen 3
J Verschlüsselung von Text? Allgemeine Java-Themen 2
S Swing Text in eine JTextArea schreiben Allgemeine Java-Themen 17
M Verschlüsselung von Text und Files durch RSA (Encoding Problem) Allgemeine Java-Themen 7
S Robuste Methode um Text von HTML code zu extrahieren..? Allgemeine Java-Themen 6
achillesat Rich Text Editor Allgemeine Java-Themen 2
M CMD-Text anzeigen Allgemeine Java-Themen 10
G Text Mining Allgemeine Java-Themen 7
B Text auf Standarddrucker drucken Allgemeine Java-Themen 3
S Library fuer Internet-Text-Daten-Quellen..? Allgemeine Java-Themen 8
nrg Find and replace Text docx Allgemeine Java-Themen 6
M Ein bestimmtes Wort in einem Text zählen (String in String) Allgemeine Java-Themen 9
S Text in for Schleife in Label einfügen Allgemeine Java-Themen 4
M Funktion gesucht: Text vektorisieren Allgemeine Java-Themen 20
D Wort in Text mit >100.000 Wörter finden Allgemeine Java-Themen 7
B Text wird nicht richtig angezeigt Allgemeine Java-Themen 9
N .doc text ändern Allgemeine Java-Themen 12
R Komponente hat nicht die gesetzten Eingeschaften (Text, Farbe) Allgemeine Java-Themen 3
M NOA an den Source Text des Dokumentes kommen Allgemeine Java-Themen 7
A Text via RegEx durchsuchen und teile ersetzten Allgemeine Java-Themen 5
O Text mit Wildcard gegen regulären Ausdruck prüfen Allgemeine Java-Themen 3
A Umwandlung von Text/Zeichen in Polynome Allgemeine Java-Themen 8
Y Eclipse ppt Folie erzeugen + text plazieren Allgemeine Java-Themen 4
cedi Eingegebenen Text in der Konsole nicht sichtbar machen oder nur in Sternchen anzeigen Allgemeine Java-Themen 2
D markierten Text kopieren Allgemeine Java-Themen 2
P Doppeltverkettete Listen + Text Allgemeine Java-Themen 5
DEvent embedded Object Database in Text Format Allgemeine Java-Themen 5
R Texterkennung - Text aus einem/r Bild/Grafik auslesen Allgemeine Java-Themen 2
M String in Html Text umwandeln Allgemeine Java-Themen 2
T eingefügter Text nach dem rendern spiegelverkehrt Allgemeine Java-Themen 2
E Text ans Ende einer Textdatei anfügen Allgemeine Java-Themen 2
E JTextArea / JEditorPane + Text formatieren Allgemeine Java-Themen 3
R Java Text anderer Schriftart einlesen Allgemeine Java-Themen 2
A AES Key aus Text erzeugen Allgemeine Java-Themen 2
S Koordinaten aus einem Text filtern Allgemeine Java-Themen 11

Ähnliche Java Themen

Neue Themen


Oben