Re: Einlesen einer GROSSEN Textdatei



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 = "";
Diese Zeile ist unnötig (tut aber auch nicht viel).
>>str = matcher.group(1).trim();
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
.



Relevant Pages

  • Re: Less is not More
    ... not produce an increase in the string's KC toward its maximum upper ... You are implying that larger substrings have constant or ... digits of computable constant X" with n as an argument, ... 24 ways I can concatenate them once each into a single string, ...
    (talk.origins)
  • Re: (?{..}) and lexical scoping issues.
    ... > @_ is most definitely a package variable. ... > (You are counting how many substrings of each string are also substrings ... > all substrings of a string. ... it will be hard to beat with a Perl program. ...
    (comp.lang.perl.misc)
  • Re: Einlesen einer GROSSEN Textdatei
    ... zeilenBean = new MeineZeilenBean; ... // if we already looked for this String, ... anzahlVorkommen = errorCount1; ...
    (de.comp.lang.java)
  • Re: Parse String
    ... it picking up substrings beginning with 'f' followed by hyphens, ... Function gnaf(s As String) As Variant ... Exit Do 'inner Do ... Loop ...
    (microsoft.public.excel.programming)
  • Re: Regex expert needed
    ... >> I am using PHP and I am trying to parse a string into substrings ...
    (Debian-User)

Loading