java-forum.org - Java programmieren aus Leidenschaft

Zurück   java-forum.org - Java programmieren aus Leidenschaft > Java - Programmierung > Java Basics - Anfänger-Themen

Java Basics - Anfänger-Themen Fragen ausschließlich zu Java-Grundlagen von Ein- und Umsteigern

Thema geschlossen    
Themen-Optionen Thema durchsuchen Ansicht
Alt 06.07.2007, 17:32   #1 (permalink)
Katjushka
Nicht angemeldet
 
Fachbeiträge: n/a
Standard Zeilenweise lesen aus einem Array

GEGEBEN: Eine Text-Datei 10MB mit den URLs und ihren Inhalten. Die sieht etwa so aus:
Zitat:
@@@ http://braeustueble.de/impressum.html


[br_Logo_web.gif]

Impressum

Gaststätte Bräustüble GbR
Postadresse
Schloßstraße 14
74831 Gundelsheim
Telefon
06269-8453
FAX
06269-45285
E-Mail
service@braeustueble.de
Vertretungsberechtigte Gesellschafter: Gisela Frank
Haftungshinweis: Trotz sorgfältiger inhaltlicher Kontrolle übernehmen wir
keine Haftung für die Inhalte externer Links. Für den Inhalt der verlinkten
Seiten sind ausschließlich deren Betreiber verantwortlich.
Kontakt

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();
                        }
                   }
               }
PROBLEM: Das Verarbeiten von "kleinen" URLs geht ziemlich flott, für die größeren Inhalte braucht das Programm
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
		 }
		 }
Wie könnte ich so etwas implementieren?

Vielen Dank im Voraus.
 
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 07.07.2007, 09:35   #2 (permalink)
Katjushka
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
 
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 07.07.2007, 10:24   #3 (permalink)
Stammbenutzer
Floppy Disc
 
Registriert seit: 25.04.2006
Fachbeiträge: 873
Abgegebene Danke: 3
Erhielt 51 Danke für 51 Beiträge
Standard Re: Zeilenweise lesen aus einem Array

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);
dann nimm einen StringBuilder anstatt
Code:
"Firmenname: "+firmenname+"\n";
Code:
for (int n=0; n < firmenname.length(); n++){
                              schreibeStrom.write((byte)firmenname.charAt(n));
                            }
Ist schreibeStrom was gepuffertes? Falls nicht: nimm was gepuffertes. Oder einen Writer. Dann kannst du Strings auf ein Mal schreiben anstatt jedes Byte extra.

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))
Lies doch direkt von der Textdatei, anstatt erst in das Array. Dann kannst du sowas machen
Code:
 
while((thisLine=reader.readLine())!=null){// oder so ähnlich 
         TODO 
}
madboy ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 07.07.2007, 21:05   #4 (permalink)
Katjushka
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();
                            }
                      }
               }
bei solchem Code, bekommt man zwar keine Fehlermeldungen, aber die Ergebnisdatei bleibt leer 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();
                            }
läuft das Programm, so wie ich will.
Was könnte der Grund sein?
 
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 07.07.2007, 21:21   #5 (permalink)
Premium-Benutzer
 
Benutzerbild von Wildcard
 
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
Wildcard ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 07.07.2007, 21:46   #6 (permalink)
Katjushka
Nicht angemeldet
 
Fachbeiträge: n/a
Aber ein Writer akzeptiert keinen StringBuilder als Parameter, und toString funktioniert mit einem StringBuilder auch nicht.
 
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 07.07.2007, 22:15   #7 (permalink)
Premium-Benutzer
 
Benutzerbild von Wildcard
 
Registriert seit: 10.11.2004
Fachbeiträge: 20.047
Abgegebene Danke: 4
Erhielt 430 Danke für 401 Beiträge
Zitat: Katjushka
und toString funktioniert mit einem StringBuilder auch nicht.
Natürlich funktioniert das.
__________________
Take back the Desktop
Wildcard ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 07.07.2007, 22:24   #8 (permalink)
Katjushka
Nicht angemeldet
 
Fachbeiträge: n/a
"Zitat" von NetBeans
Zitat:
D:\InfoExtraktion\src\infoextraktion\MatcheZeile.java:100: toString() in java.lang.Object cannot be applied to (java.lang.StringBuilder)
 
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 07.07.2007, 22:31   #9 (permalink)
stev.glasow
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.

Zitat:
toString() in java.lang.Object cannot be applied to (java.lang.StringBuilder)
öh?
 
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 07.07.2007, 22:47   #10 (permalink)
Katjushka
Nicht angemeldet
 
Fachbeiträge: n/a
Nicht vergessen, es ist ein "Anfängerfragen" Thread
Zitat:
Wird (i+1)+matcher.group(2)+"\n" nicht eh vom compiler in str_buf.append(bla) optimiert?
Sagt mir leider gar nichts.
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.
 
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 07.07.2007, 22:56   #11 (permalink)
Premium-Benutzer
 
Benutzerbild von Wildcard
 
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
Wildcard ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 08.07.2007, 10:46   #12 (permalink)
stev.glasow
Nicht angemeldet
 
Fachbeiträge: n/a
Zitat: Katjushka
Nicht vergessen, es ist ein "Anfängerfragen" Thread
Zitat:
Wird (i+1)+matcher.group(2)+"\n" nicht eh vom compiler in str_buf.append(bla) optimiert?
Sagt mir leider gar nichts.
Damit wollte ich sagen dass es bei sowas
Code:
(i+1)+matcher.group(2)+"\n"
oder sowas
Code:
"Firmenname: "+firmenname+"\n";
eigentlich egal ist ob du da nun selber nen StringBuffer (bzw StringBuilder) verwendest, der compiler macht das in diesem fall intern sowieso schon (glaube ich).


Zitat: Katjushka
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?
Jo, damit kann man relativ einfach performance kritische aufrufe herausfinden, aber versuch erstmal deinen regulären ausdruck wie beschrieben abzuändern.


Zitat: Katjushka
Das Zitat wurde für Wildcard gepostet, weil er gemeint hat, dass toString() für einen StringReader funktioniert.
funktioniert auch. irgendwie machst du da was falsch. hier mal nen beispiel:

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);
Ausgabe: das ist ein test
 
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 08.07.2007, 10:53   #13 (permalink)
Premium-Benutzer
 
Benutzerbild von Wildcard
 
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
Wildcard ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Thema geschlossen    

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
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

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:41 Uhr.


Powered by vBulletin® Version 3.8.6 (Deutsch)
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.2
Thanks for Smilies by smilies.4-user.de