Performant große Dateien durchsuchen

osiris86

Mitglied
Hallo erstmal,

ich habe mehrere große Logdateien die ca. 50 - 500 MB groß werden können, und will diese gerne mit Regex durchsuchen.
Leider ist mir aufgefallen das es bei einer 30MB Datei (ca. 100.000 Zeilen) schon min. 3 Sec. dauert
bis die Datei komplett durchsucht wurde.
Wisst ihr vielleicht eine perfomantere Möglichkeit große Dateien zu durchsuchen?!
Das Problem scheint das einlesen der Zeilen in den Stringbuffer zu sein.

Java:
    Scanner sc = null;
    try {
      sc = new Scanner(new File("D:/grosseLogDatei.log"));
    } catch (FileNotFoundException e) {
      System.err.println("File not found" + e.getMessage());
    }
    StringBuffer buff = new StringBuffer();
    while (sc.hasNext()) {
      buff.append(sc.nextLine());
    }
    String regex = ("(?i)" + "(suchtext)");
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(buff);
    while (m.find()) {
      System.out.println(" " + m.group());
    }
    sc.close();


Danke schon mal für eure Antworten

Gruß
 
S

SlaterB

Gast
> Das Problem scheint das einlesen der Zeilen in den Stringbuffer zu sein.

prüfe das doch, messe mit System.currentTimeMillis(), wieviel Zeit genau aufs Einlesen und andere Schritte entfällt

1 sec pro 10 MB allein fürs Einlesen hielte ich nicht für so schlecht,
selbst wenn das Programm Zufallsdaten erzeugen würde, wäre mir das allein für die Speicherreservierung + Befüllung recht ordentlich

bisschen schneller geht aber immer irgendwie,
Scanner liest den Text sowieso schon in irgendeine Art Buffer, muss für dein Programm dann mühsam nach Zeilen trennen,
und die Zeilen sammelst du selber wieder in einen Buffer, das klingt unnötig doppelt,
aber hat immerhin einen Effekt, das Aussortieren der Zeilenumbrüche, die musst du sonst im RegEx berücksichtigen
(mit kleinen Test-String von drei Zeilen testen, Pattern.MULIT_LINE spielt da wohl mit, google-Suche)

zum Einlesen jedenfalls alternative FileReader und dort char[] lesen, immer gleich 100.000 Zeichen oder so, die kann man bestimmt auch in den StringBuffer einfügen,

StringBuilder ist minimal moderner und schneller als StringBuffer

das schnellste Lesen bietet vielleich FileChannel, kenne ich aber nicht
Using FileChannel to read text file : FileChannelFileJava Tutorial
 

KrokoDiehl

Top Contributor
Du liest in dem geposteten Code zuerst die Datei komplett ein, und durchsuchst sie dann komplett nach nach dem RegExp. Wenn du den gesamten Inhalt nicht brauchst, könnte es schon etwas bringen, wenn du eine Zeile liest, hier nach RegExp suchst. Aber das ist natürlich auch eine Frage, wie die Datei inhaltlich aufgebaut ist und schlägt zB dann fehl, wenn der RegExp über mehrere Zeilen geht.

Sprich etwas wie:
Java:
while (sc.hasNext()) {
    String line = sc.nextLine();

    myPattern.matcher(line);
    ...

}
 

fastjack

Top Contributor
Ich vermute mal, bei p.matcher(...) wirds klemmen, wenn das auf nen Riesenstring losgelassen wird, durch geeignete Ausgaben wirst Du genaueres erfahren. Ansonsten würde ich auch einfach zeilenweise, oder besser blockweise (also jeweils 100 Zeilen usw.), prüfen.
 

osiris86

Mitglied
Die Zeilen einzelt durchsuchen habe ich auch schon probiert, das dauert sogar noch ein stück länger.
System.currentTimeMillis() habe ich auch schon probiert, es liegt definitiv am einlesen in den StringBuffer, das durchsuchen mit regex, geht ziemlich flott.
Ich werde es mal mit dem FileReader probieren, vielleicht klappt es besser, ich melde mich dann nochmal.

Gruß & Danke für die Antworten
 

osiris86

Mitglied
Also mit dem BufferedReader geht es einwandfrei...

Java:
try {
	    BufferedReader reader = new BufferedReader(new FileReader(new File(
		    "D:/test.txt")));
	    while (reader.readLine() != null) {
		String line = reader.readLine();
		if (line != null && line.contains("test")) {
		    System.out.println(line);
		}
	    }
	} catch (FileNotFoundException e) {
	    e.printStackTrace();
	} catch (IOException e) {
	    e.printStackTrace();
	}

ich bau jetzt mal das Regex ein und dann sesh ich mal weiter!

Danke für den Tipp
 

Jay_030

Aktives Mitglied
Je nach Größe der Dateien, Suchaufwand und vorhandener Rechenknechtkraft würde es sich auch lohnen, das Einlesen und Durchsuchen der Daten in Threads aufzuteilen, wenn denn das Einlesen solange dauert. Wenn z.B. die ersten 100 oder 500 Zeichen gelesen sind, kann bereits ein Worker-Thread diese mit einem RegEx durchsuchen. Währenddessen liest dein "Reader-Thread" die nächsten paar hundert Zeichen ein usw usf.

Vorzugsweise mittels ThreadPools, also ExecutorService und Executors zu lösen. Damit du die Arbeitspakete immer auf eine feste Anzahl Threads verteilen kannst, würde sich ein FixedThreadPool gut eignen.

Musst du schauen, ob das dann noch was bringt.
 

Wildcard

Top Contributor
Wenn du wirklich vor hast den kompletten Inhalt der Datei in den Speicher zu laden, dann mach es zumindest so:
Java:
File file = new File("D:/grosseLogDatei.log"):
...
    StringBuilder buff = new StringBuilder(file.length());
    while (sc.hasNext()) {
      buff.append(sc.nextLine());
    }

Wenn du den StringBuilder/Buffer mit einer sinnvollen Größe initialisierst muss das interne Array nicht ständig vergrößert und umkopiert werden.
 

fastjack

Top Contributor
Oder nutze apache.commons.io. Dort gibt es sehr viele Möglichkeiten im Umgang mit Dateien. Interessant für Dich sind vielleicht die readFile-Methoden der FileUtils-Klasse.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Best Practice Elemente aus ArrayList entfernen (performant) Java Basics - Anfänger-Themen 6
M BufferedImage performant einlesen Java Basics - Anfänger-Themen 5
O grosse Textdatei performant als string speichern Java Basics - Anfänger-Themen 8
S Arbeitsfeld in gleich große Bereiche einteilen Java Basics - Anfänger-Themen 2
G Best Practice Wie große "Tabellen" effizient durchsuchen und Daten händeln? Java Basics - Anfänger-Themen 15
C Große Zahlen vergleichen Java Basics - Anfänger-Themen 19
S 4 große Textdateien zu einer Mergen Java Basics - Anfänger-Themen 5
K Große Datenliste Java Basics - Anfänger-Themen 2
E Große Datenmengen effizient in CSV File speichern Java Basics - Anfänger-Themen 4
1 Extrem große Variable Java Basics - Anfänger-Themen 1
S Best Practice MVC und große Datenmengen aus einer mySQL - Datenbank Java Basics - Anfänger-Themen 24
M Mergesort Aufgabe große Probleme Java Basics - Anfänger-Themen 9
P Schneller Quadratzahltest für beliebig große natürliche Zahlen Java Basics - Anfänger-Themen 2
T Scanner für große Textdatei Java Basics - Anfänger-Themen 11
N Input/Output Große Dateien schnell Speichern/auslesen Java Basics - Anfänger-Themen 16
B große jpeg verarbeiten Java Basics - Anfänger-Themen 8
K Große Gleitkommazahlen runden Java Basics - Anfänger-Themen 8
X Compiler-Fehler javac - 08 eine zu große int? Java Basics - Anfänger-Themen 11
turmaline String teilen in gleich große strings Java Basics - Anfänger-Themen 15
F Große Potenzen berechnen Java Basics - Anfänger-Themen 6
J Große .txt einlesen - Idee? Java Basics - Anfänger-Themen 16
E Datentypen Große Zahl erzeugen Java Basics - Anfänger-Themen 5
P Kleines Projekt -> Große Überlegungen Java Basics - Anfänger-Themen 2
F Große Daten und große Array Java Basics - Anfänger-Themen 21
J Große animierte Gif preloaden und solange mit einer nicht animierten ersetzen Java Basics - Anfänger-Themen 5
Povlsen84 Datentypen Große, sortierte, schnelle Datenstruktur Java Basics - Anfänger-Themen 9
H Große Projekte mit Java - Ausführbare Datei Java Basics - Anfänger-Themen 2
K Eclipse EMF und das große HÄ? Java Basics - Anfänger-Themen 5
T .split(";") nicht gleich große arrays werden erzeu Java Basics - Anfänger-Themen 2
G String aus Zahlen multiplizieren -> unendlich große ! Java Basics - Anfänger-Themen 13
M Spielt der Debugger bei java eine große Rolle Java Basics - Anfänger-Themen 3
C große Matrizen, Performance, (Pointer?) Java Basics - Anfänger-Themen 6
L JTextArea große setzen Java Basics - Anfänger-Themen 5
S große probleme mit java Java Basics - Anfänger-Themen 6
R große Datenmenge in Datei schreiben Java Basics - Anfänger-Themen 8
M FileOutputStream und zu große Zahlen! Java Basics - Anfänger-Themen 10
J Große *.Text Datei zum verschicken in viele kleine Java Basics - Anfänger-Themen 7
B Probleme große Strings zu schreiben Java Basics - Anfänger-Themen 2
A große errechnete datenmengen sofort in datei schreiben? Java Basics - Anfänger-Themen 6
S Große Text dateien einbinden Java Basics - Anfänger-Themen 3
R große Zahlen Java Basics - Anfänger-Themen 4
R Große Zahlen Java Basics - Anfänger-Themen 3
T Große Zahlen aufgesplittet in verketteter Liste speichern Java Basics - Anfänger-Themen 4
N Große Probleme mit StingBuffer und Array Java Basics - Anfänger-Themen 2
H .java Dateien in Eclipse einbinden und ausführen Java Basics - Anfänger-Themen 1
I Dateien aus dem Resource Folder laden Java Basics - Anfänger-Themen 2
A Thread XML-Dateien zusammenfügen Java Basics - Anfänger-Themen 11
Buroto Threads Verschiedene .txt Dateien Auf Listen und Verbinden Java Basics - Anfänger-Themen 3
J Dateien lesen und schreiben Java Basics - Anfänger-Themen 5
B Jar Dateien ohne IDE verwenden? Java Basics - Anfänger-Themen 1
A Optimierung eines Programms: Mergen der Dateien Java Basics - Anfänger-Themen 23
A Zwei XML-Dateien Mergen Java Basics - Anfänger-Themen 14
A Input/Output Mehrere Csv-Dateien einlesen Java Basics - Anfänger-Themen 2
LetsSebi Dateien werden nicht in Zip gespeichert Java Basics - Anfänger-Themen 1
J Alle .java Dateien von einem Verzeichnis in eine Zip speichern Java Basics - Anfänger-Themen 2
J Alle Dateien aus einem Verzeichnis laden Java Basics - Anfänger-Themen 10
MiMa log4j als separate Dateien in Schleife? Java Basics - Anfänger-Themen 6
M Scannen von *.txt - Dateien; wo sind der oder die Fehler? Java Basics - Anfänger-Themen 4
A Input/Output Dateien einlesen und ausgeben Java Basics - Anfänger-Themen 7
S Lese- / Schreibfähigkeit von Dateien sicherstellen Java Basics - Anfänger-Themen 1
C "HelloWorld" - Dateien erstellt, aber ist es eine class-Datei? Java Basics - Anfänger-Themen 2
J Java findet plötzlich die Dateien im Projekt nicht mehr. Java Basics - Anfänger-Themen 12
J Dateien in Verzeichnissen rekursiv auflisten wirft Exception Java Basics - Anfänger-Themen 4
L Classpath Alle Dateien im Classpath finden Java Basics - Anfänger-Themen 4
MiMa Formate für Dateien und Pfade? Java Basics - Anfänger-Themen 1
O Datei in mehrere kleine Dateien umwandeln Java Basics - Anfänger-Themen 47
L Richtige Reihenfolge der Dateien Java Basics - Anfänger-Themen 5
CptK Datentypen Text Dateien einlesen Java Basics - Anfänger-Themen 3
J Logging erzeugt zwei dateien.... Java Basics - Anfänger-Themen 7
A Dateien Verschieben Java Basics - Anfänger-Themen 1
M Mehre Dateien parallel kopieren mit Multithreading Java Basics - Anfänger-Themen 8
C Methoden Dateien im Ordner anzeigen Java Basics - Anfänger-Themen 12
J Java-Dateien lassen sich nicht editieren Java Basics - Anfänger-Themen 46
E FTP Dateien hochladen Java Basics - Anfänger-Themen 3
J Probleme beim schreiben von Dateien Java Basics - Anfänger-Themen 5
Korvinus Vergleichen von 2 csv-Dateien Java Basics - Anfänger-Themen 2
I Texte mit Absätzen in Dateien speichern und auslesen Java Basics - Anfänger-Themen 1
M "substring()" mit Dateien und Pfadangaben Java Basics - Anfänger-Themen 5
Voreck Jar Dateien Standart programm ändern Java Basics - Anfänger-Themen 12
K Dateien aus Source-Package verwenden Java Basics - Anfänger-Themen 10
B Dateien aus dem "resource" - Folder kopieren in Verzeichnis Java Basics - Anfänger-Themen 9
B Kopieren von Dateien mit Adminberechtigungen Java Basics - Anfänger-Themen 14
F Threads ftp4j, viele Dateien upload Java Basics - Anfänger-Themen 5
P Einen Ordner mit Dateien hochladen [FTP] Java Basics - Anfänger-Themen 2
X Dateien direkt hintereinander schreiben, Dateiname Java Basics - Anfänger-Themen 25
G Messwerte in 2 Dateien schreiben Java Basics - Anfänger-Themen 20
C Verarbeitung von sehr großen Dateien Java Basics - Anfänger-Themen 52
F Input/Output Dateien lesen/schreiben Java Basics - Anfänger-Themen 1
V Mehrere Dateien aus JFileChooser in eine ArrayList speichern Java Basics - Anfänger-Themen 2
K Dateien lesen | IndexOutOfBoundsException Java Basics - Anfänger-Themen 2
T Classpath Problem mit dem auslesen von Text-Dateien (Pfad) Java Basics - Anfänger-Themen 3
A attach source: Zusammenhang zwischen JAR und .class/.java Dateien? Java Basics - Anfänger-Themen 2
T .jar Datei als Ordner benutzen/ Dateien aus .jar Datei auslesen Java Basics - Anfänger-Themen 3
C Klassen Class Files nachladen (mehrer .jar Dateien) Java Basics - Anfänger-Themen 2
Bluedaishi for schleife um Dateien wieder zusammen zu fügen Java Basics - Anfänger-Themen 11
S Resourcen-Dateien im Jar-File verfügbar machen (Intellij 14) Java Basics - Anfänger-Themen 14
J Dateien für anderen User "mitgeben" Java Basics - Anfänger-Themen 1
S Dateien mit Java verschieben Java Basics - Anfänger-Themen 6
A Heap Space Error bei rekursiver Suche in Dateien trotz nur einer Zeile im Speicher Java Basics - Anfänger-Themen 26
E Dateien werden nicht gelöscht Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben