Re: Einlesen einer GROSSEN Textdatei
- From: Stefanie Ertheld <Dulidali89@xxxxxx>
- Date: Sat, 05 Jan 2008 12:05:36 +0100
Bernd Eckenfels schrieb:
wieviele Zeilen enthalten a oder b und werden (dauerhaft!) im speicher gehalten? (und wozu?)
Wie genau meinst du das? Jedenfalls ist das eine Stelle die ich stark vekürzt habe. In Wirklichkeit gibt es knapp 50 Substrings, auf die ich prüfe. Wenn eine Logausgabe z.B. mit "Fein:" beginnt, so möchte ich diese Zeile nicht mit einlesen. Da das alles statische Substrings sind, dachte ich mir das wäre effizienter als das auch über reguläre Ausdrücke zu regeln.
>>str = matcher.group(1).trim();str = "";Diese Zeile ist unnötig (tut aber auch nicht viel).
str += matcher.group(3).trim();
Naja, in Wirklichkeit sieht der Code hier auch etwas anders aus. Er ist in einer Methode, und die hat als ein Argument einen Var Args Parameter - damit kann ich also eine beliebige Anzahl an ints übergeben, jeder int für eine Gruppe, die ich erhalten möchte. Ich laufe dann über das Var Args Array und dort steht in der schleife lediglich:
str += matcher.group(i).trim();
Da da ein Plus ist, muss ich den String vorher leeren.
sein dass du sehr viele Daten deiner Eingabedatei im speicher haelst.
Warum?! Ich lese doch eigentlich Zeile für Zeile meiner Datei ein, und dan laufe ich mit 10-20 regulären Ausdrücken sowie mit knapp 50 Substrings über jede Zeile, um sie zu filtern und zu entscheiden ob sie überhaupt gespeichert werden soll. Das mit dem "startsWith" mache ich 2 mal, da wenn ein String so bereits anfängt, will ich ihn erst garnicht mit regulären Ausdrücken prüfen. Und dann, nachdem er durch reguläre Ausdrücke gefiltert wurde, möchte ich das nochmal prüfen, weil sich ja der String in der Zwischenzeit eventuell so geändert hat, dass jetzt vorne das zu filternde steht. In Wirklichkeit wird das aber von einer Hilfsfunktion erledigt sodass zu mindest nur der Aufruf der Funktion doppelt ist.
Collections.sort(myList);
Collections.sort(this.logGarbageList);
Also du haelst im Prinzip die komplette Datei im Speicher, entsprechend
Gross musst du den Heap (nicht von Eclipse) einstellen.
Aber die Datei hat ja nur 30MB - aber der Speichervebrauch übersteigt aktuell 256MB Speicher!!!
Gestern habe ich mir mal den tptp Profiler von Eclipse installiert -
leider kriegt auch der eine OutOfMemory Exception wenn er mein Programm analysiert - muss ich da irgendwie den möglichen Speicher von Eclipse erhöhen (Hab ich nicht hingekriegt)?
Jedenfalls scheint noch viel heftiger die Analyse der Listen zu sein.
Für jeden Listeneintrag erzeuge ich eine kleine Bean, die ein int count und ein int text enthält, sowie eine toString und eine compareTo Methode. Jetzt lauf ich jeweils durch die Liste und zähle wie oft eine Zeile vorkommt, speichere den Text und die Anzahl an Vorkommen dann in meiner Bean ab. Um nicht mehrmals dasselbe zu tun prüfe ich dann über die compareTo Methode ob eine Zeile schon mal geprüft wurde.
So ungefähr sieht es aus:
<code>
Set<MeineZeilenBean> zeilenCompareSet = new TreeSet<MeineZeilenBean>();
String zeile = null;
MeineZeilenBean zeilenBean = null;
int anzahlVorkommen = 1;
if (meineListe != null && meineListe.size() > 0) {
for(int lineIndex = 0; lineIndex< meineListe.size();lineIndex++) {
zeile = meineListe.get(lineIndex);
zeilenBean = new MeineZeilenBean(zeile);
// if we already looked for this String, skip it
if(! zeilenCompareSet.contains(zeilenBean) ) {
int errorCount1 = 1;
String nextLine= null;
for(int nextLineIndex=lineIndex+1;nextLineIndex< meineListe.size();nextLineIndex++){
nextLine = meineListe.get(nextLineIndex);
if(nextLine.equals(zeile)){
errorCount1++;
} else { // go to next line to compare
break;
}
}
anzahlVorkommen = errorCount1;
zeilenBean.setErrorCount(anzahlVorkommen);
zeilenCompareSet.add(zeilenBean);
}
}
}
</code>
und später sortiere ich mit einem Comparator noch die Objekte der Liste anhand ihres Counts und Anhand ihres Textes als zweites Kriterium. Wie man das aber effizienter machen könnte, keine Ahnung.
Danke,
Stefanie
.
- Follow-Ups:
- Re: Einlesen einer GROSSEN Textdatei
- From: mail
- Re: Einlesen einer GROSSEN Textdatei
- From: Ralf Ullrich
- Re: Einlesen einer GROSSEN Textdatei
- From: Peter Büttner
- Re: Einlesen einer GROSSEN Textdatei
- From: Ralf Ullrich
- Re: Einlesen einer GROSSEN Textdatei
- From: Achim Peters
- Re: Einlesen einer GROSSEN Textdatei
- References:
- Re: Einlesen einer GROSSEN Textdatei
- From: Stefanie Ertheld
- Re: Einlesen einer GROSSEN Textdatei
- From: Bernd Eckenfels
- Re: Einlesen einer GROSSEN Textdatei
- Prev by Date: Re: Einlesen einer GROSSEN Textdatei
- Next by Date: Re: Einlesen einer GROSSEN Textdatei
- Previous by thread: Re: Einlesen einer GROSSEN Textdatei
- Next by thread: Re: Einlesen einer GROSSEN Textdatei
- Index(es):
Relevant Pages
|
Loading