![]() |
|
|||||||
| Java Basics - Anfänger-Themen Fragen ausschließlich zu Java-Grundlagen von Ein- und Umsteigern |
|
|
|
Themen-Optionen | Thema durchsuchen | Ansicht |
| #1 (permalink) | ||||||||||||||||
|
Nicht angemeldet
Fachbeiträge: n/a
|
GEGEBEN: Eine Text-Datei 10MB mit den URLs und ihren Inhalten. Die sieht etwa so aus:
ZIEL: Firmennamen aus den URLs extrahieren VORGANG: 1. Jede URL und ihre Inhalt wird in einen Array blocks[] eingelesen. Das Array enthält also in jeder Zelle eine URL und ihre Inhalt 2. Das Array wird durchgelaufen, und in jeder "Zelle" wird nach dem RegEx gesucht. Bis jetzt habe ich es so gemacht: Code:
for(int i =0; i<blocks.length; i++){
Matcher matcher2 = pattern2.matcher(blocks[i]);
while(matcher2.find()){
String regexImage ="(\\[.*|\\s{2,}|\\*|@@@.*|www.*|.*\\|.*|ist.*|\\sin\\s.*|\\s.\\s|Verantwortlich für diese Seite|\\s.{4}\\s{2,}|Firmenname:?\\s*|Vereinsname:?|Name:?|\\d{3,}|Firma:?\\s|Verantwortlich für die Website:|Email.*|\\.\\W*|Info:.*|Mail:.*|\\sund.*|,.*|\\_*)";
Pattern patternImage= Pattern.compile(regexImage);
firmenname = matcher2.group();
Matcher matcherImage =patternImage.matcher(firmenname);
firmenname = matcherImage.replaceAll("");
if (firmenname.length() > 5){
firmenname="Firmenname: "+firmenname+"\n";
try {
for (int n=0; n < firmenname.length(); n++){
schreibeStrom.write((byte)firmenname.charAt(n));
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
aber sehr lange. LÖSUNG, DIE ICH MIR VORSTELLE: innerhalb der Zellen Zeilenweise einlesen, also etwas in der Art: Code:
for(int i =0; i<blocks.length; i++){
while((thisLine=reader.readLine())!=null){// oder so ähnlich
TODO
}
}
Vielen Dank im Voraus. |
|||||||||||||||
| #2 (permalink) | |
|
Nicht angemeldet
Fachbeiträge: n/a
|
Kann mir wirklich keiner helfen?
Jetzt hab ich das Programm laufen lassen, und es läuft 10 Stunden auf meinem PC. Wenn keiner weiß, wie es mit dem zeilenweise Einlesen geht, habt ihr vielleicht andere Ideen, wie man die Laufzeit verbessern könnte? Vielen Dank |
| #3 (permalink) | |
|
Stammbenutzer
Floppy Disc
Registriert seit: 25.04.2006
Fachbeiträge: 873
Abgegebene Danke: 3
Erhielt 51 Danke für 51 Beiträge
|
zum Beschleunigen der Sache: mach erst mal das aus der Schleife raus:
Code:
String regexImage ="(\\[.*|\\s{2,}|\\*|@@@.*|www.*|.*\\|.*|ist.*|\\sin\\s.*|\\s.\\s|Verantwortlich für diese Seite|\\s.{4}\\s{2,}|Firmenname:?\\s*|Vereinsname:?|Name:?|\\d{3,}|Firma:?\\s|Verantwortlich für die Website:|Email.*|\\.\\W*|Info:.*|Mail:.*|\\sund.*|,.*|\\_*)";
Pattern patternImage= Pattern.compile(regexImage);
Code:
"Firmenname: "+firmenname+"\n"; Code:
for (int n=0; n < firmenname.length(); n++){
schreibeStrom.write((byte)firmenname.charAt(n));
}
Allgemein noch: wenn du es irgendwie einrichten kannst: lass den regex nicht über alles laufen. Das wird sehr langsam. Treffe statt dessen eine "vorauswahl", z.B. mit IndexOf und matche die dann mit dem regex. Ausserdem kannst du auch selber schauen, wo das Programm so lange braucht. Ein paar Ausgaben in der Art sollten dich auf die richtige Spur bringen: Code:
long time = System.currentTimeMillis();
//vermuteter Übeltäterblock ;-)
System.out.println("time: " + (System.currentTimeMillis() - time))
Code:
while((thisLine=reader.readLine())!=null){// oder so ähnlich
TODO
}
|
|
|
| #4 (permalink) | |
|
Nicht angemeldet
Fachbeiträge: n/a
|
Das mit dem Writer klappt komischerweise nicht:
Code:
writer = new FileWriter("123.txt");
for(int i =200; i<250; i++){
Matcher matcher = pattern.matcher(blocks[i]);
while (matcher.find()){
aktuelleurl=(i+1)+matcher.group(2)+"\n";
System.out.println(aktuelleurl);
try {
writer.write(aktuelleurl);
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
Wenn ich das gleiche schreibe bloss mit:
Code:
try {
for (int n=0; n < aktuelleurl.length(); n++){
schreibeStrom.write((byte)aktuelleurl.charAt(n));
}
} catch (IOException ex) {
ex.printStackTrace();
}
Was könnte der Grund sein? |
| #5 (permalink) | |
|
Premium-Benutzer
Registriert seit: 10.11.2004
Fachbeiträge: 20.047
Abgegebene Danke: 4
Erhielt 430 Danke für 401 Beiträge
|
Solange in deinem Code noch irgendein String + String steht brauchen wir über Performance eigentlich gar nicht weiter zu reden
Die nächste Sache ist das rausschreiben. Bei größeren Datenmengen ist hier der FileChannel am schnellsten.
__________________
Take back the Desktop |
|
|
| #7 (permalink) | ||||||||||||||||
|
Premium-Benutzer
Registriert seit: 10.11.2004
Fachbeiträge: 20.047
Abgegebene Danke: 4
Erhielt 430 Danke für 401 Beiträge
|
__________________
Take back the Desktop |
|||||||||||||||
|
|
||||||||||||||||
| #9 (permalink) | ||||||||||||||||
|
Nicht angemeldet
Fachbeiträge: n/a
|
Wird (i+1)+matcher.group(2)+"\n" nicht eh vom compiler in str_buf.append(bla) optimiert?
Hast du mal nen Profiler darüber laufen lassen? Ich glaub dein regex ist übelst langsam diese .* fressen gut zeit soweit ich weiß, mach da mal nen .+? draus so weit das möglich ist.
|
|||||||||||||||
| #10 (permalink) | ||||||||||||||||
|
Nicht angemeldet
Fachbeiträge: n/a
|
Nicht vergessen, es ist ein "Anfängerfragen" Thread
![]() ![]()
Von einem Profiler höre ich zum ersten Mal in meinem Leben. Hab jetzt bei Google angegeben, scheint ein Programm zu sein, dass einen Code nach Laufzeiten und vielleicht Speicherbedarf kontrolliert, oder? Das Zitat wurde für Wildcard gepostet, weil er gemeint hat, dass toString() für einen StringReader funktioniert. |
|||||||||||||||
| #11 (permalink) | |
|
Premium-Benutzer
Registriert seit: 10.11.2004
Fachbeiträge: 20.047
Abgegebene Danke: 4
Erhielt 430 Danke für 401 Beiträge
|
toString kann man auf jedem Objekt aufrufen.
Du machst wohl was falsch.
__________________
Take back the Desktop |
|
|
| #12 (permalink) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Nicht angemeldet
Fachbeiträge: n/a
|
Code:
(i+1)+matcher.group(2)+"\n" Code:
"Firmenname: "+firmenname+"\n";
Code:
StringBuilder buf = new StringBuilder();
buf.append("das");
buf.append(' ');
buf.append("ist ");
buf.append("ein test");
String str = buf.toString();
System.out.println(str);
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #13 (permalink) | |
|
Premium-Benutzer
Registriert seit: 10.11.2004
Fachbeiträge: 20.047
Abgegebene Danke: 4
Erhielt 430 Danke für 401 Beiträge
|
Ja, der Compiler baut das in StringBuilder/Buffer um (anders kann man Strings nicht verknüpfen). Das Problem ist, das er nicht in der Lage ist den Builder/Buffer in einer sinnvollen Größe zu initialisieren und die richtige Position zur Objekterzeugung zu finden.
In Schleifen führt das zu massiven Laufzeitproblemen.
__________________
Take back the Desktop |
|
|
|
| Themen-Optionen | Thema durchsuchen |
| Ansicht | |
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Xml lesen und in .txt zeilenweise schreiben | theone101 | XML und Co. | 4 | 25.02.2008 12:58 |
| Datei zeilenweise lesen. | Java-Anfänger | Java Basics - Anfänger-Themen | 4 | 11.01.2008 22:52 |
| String zeilenweise lesen | Serpil | Allgemeine Java-Themen | 9 | 01.06.2007 19:05 |
| Zeilenweise aus einem StringBuffer lesen | Granjow | Allgemeine Java-Themen | 4 | 18.09.2006 15:53 |
| Datei in einem executable jar zeilenweise lesen | hurz | Java Basics - Anfänger-Themen | 1 | 06.08.2006 16:26 |
| Lesezeichen |
|
|