Entwickler-Ecke
IO, XML und Registry - 10 MB große Log-Datei zeilenweise einlesen? - CPU 100 %
Jörg Roth - Mo 17.09.07 15:02
Titel: 10 MB große Log-Datei zeilenweise einlesen? - CPU 100 %
Hallo zusammen,
ich bin ganz neu hier und habe auch schon nach einem ähnlichen Thread zu meinem Thema gesucht, aber leider keinen gefunden :(
Es geht darum eine ca. 10 Megabyte große Log-Datei zu öffnen. (TXT-Format)
In dieser Datei sind alle Daten einer Maschine mitgeloggt. Das Problem ist, dass mit jedem neuen Job die Maschine die Logdatei nur erweitert. D.h. sie wird immer länger.
--> Daran kann ich nichts ändern, und das ist auch nicht mein Problem! Soweit nur als Info.
Meine Aufgabe besteht darin in der riesigen Log-Datei den letzten Job zu isolieren und darin nach bestimmten Ereignissen suchen.
Darum versuche ich nun die Textdatei mittels einem Streamreader zeilenweise in ein string-Array (jedes Element ist eine string-Zeile) einzulesen.
Wenn eine Zeile das Schlüsselwort "BVR-Start" enthält, 'vergesse' ich alles was ich bisher eingelesen habe und setze den Arrayindex auf 0.
Dadurch habe ich erreicht, dass nur der letzte Job, der ja vor kurzem ganz hinten an der riesigen Log-Datei angehängt wurde in meinem Array zeilenweise steht.
Mein Problem ist nun, dass das ganze bei ein paar Zeilen klappt, aber bei der Original-Log mit 10 MB ist meine CPU mit 100 % ausgelastet während dem zeilenweise öffnen :(
Ausserdem kann ich ja vorher nicht wissen, wie groß mein Array sein muss, d.h. wie viele Zeilen ich einlese.
Gibt es eine andere Möglichkeit???
Kann ich eine Text-Datei auch vom Ende her zeilenweise einlesen?
Vielen Dank für eure konstruktiven Tipps!
Christian S. - Mo 17.09.07 16:26
Hi!
Ich habe das gerade mal mit einer 30MB Datei mit unten stehendem Quelltext getestet. Das dauert bei mir keine fünf Sekunden. Ich benutze allerdings auch eine generische Liste, um das Problem zu umgehen, dass ich die Anzahl der Zeilen nicht kenne.
Chrome-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| var filename := 'e:\access-200708.log'; var lines := new List<String>; using sr := new StreamReader(filename) do while not sr.EndOfStream do begin var line := sr.ReadLine; if line.Contains('22:38') then lines.Clear else lines.Add(line); end; for l in lines do Console.WriteLine(l); Console.Readline; |
Sorry, habe gerade kein C# da, aber es sollte sich leicht von Chrome nach C# portieren lassen.
Grüße
Christian
Kha - Mo 17.09.07 17:59
Jörg Roth hat folgendes geschrieben: |
Kann ich eine Text-Datei auch vom Ende her zeilenweise einlesen? |
Natürlich kannst du das, auch wenn es keine vorgefertigte Methode wie File.ReadAllLines dafür gibt. Mithilfe von Stream.Seek und ReadByte wird deine selbst geschriebene Funktion nur schwer schlagbar sein - vor allem der RAM wird es dir danken ;) .
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!