Finalize Block blockiert Programmablauf

henpara

Bekanntes Mitglied
Hallo,
ich lese ca 570000 Datensätze ein. Das funktioniert hier auch gut:

Java:
public void readAllData() throws IOException {
		int linecount = 0;
		File readfile1 = new File(".\\bin\\data\\C00-C20.txt");
		File readfile2 = new File(".\\bin\\data\\C21-C49.txt");
		File readfile3 = new File(".\\bin\\data\\C50-C64.txt");
		File readfile4 = new File(".\\bin\\data\\C65-C90.txt");
		File readfile5 = new File(".\\bin\\data\\C91-CAll.txt");
		FileReader freader = new FileReader(readfile1);
		BufferedReader breader = new BufferedReader(freader, 65536);
		String readline = breader.readLine();
		Dataset myData = new Dataset();
		while (readline!=null) {
			linecount++;
			if (linecount%10000==0) {
				System.out.println("Wir sind in Zeile: " + linecount);
			}
			//readline = breader.readLine();
			int counter = 0;
			while (readline.contains("\t")) {
				counter++;
				int tab = readline.indexOf("\t".charAt(0));
				while (tab != -1) {
					String sub = readline.substring(0, tab);
					readline = readline.substring(tab+1, readline.length());
					switch(counter) {
					//Hier wird der Datensatz eingelesen
					}
					tab = readline.indexOf("\t".charAt(0));
					counter++;
				}
				myData.setasterix(readline);
				myData.setdatensatznummer(linecount);
				mydata.add(myData);
			}
			readline = breader.readLine();
		}
		
		freader = new FileReader(readfile2);
		breader = new BufferedReader(freader, 65536);
		readline = breader.readLine();
		while (readline!=null) {
			linecount++;
			if (linecount%10000==0) {
				System.out.println("Wir sind in Zeile: " + linecount);
			}
			//readline = breader.readLine();
			int counter = 0;
			while (readline.contains("\t")) {
				counter++;
				int tab = readline.indexOf("\t".charAt(0));
				while (tab != -1) {
					String sub = readline.substring(0, tab);
					readline = readline.substring(tab+1, readline.length());
					switch(counter) {
					//Hier wird der Datensatz eingelesen
					}
					tab = readline.indexOf("\t".charAt(0));
					counter++;
				}
				myData.setasterix(readline);
				myData.setdatensatznummer(linecount);
				myData.setdatensatzid(Long.valueOf(((String.valueOf(myData.getpop_number()) + String.valueOf(myData.getcancer_number()) + String.valueOf(myData.getage_group()) + String.valueOf(myData.getsex() + "10")))));
				mydata.add(myData);
			}
			readline = breader.readLine();
		}
		freader = new FileReader(readfile3);
		breader = new BufferedReader(freader, 65536);
		readline = breader.readLine();
		while (readline!=null) {
			linecount++;
			if (linecount%10000==0) {
				System.out.println("Wir sind in Zeile: " + linecount);
			}
			//readline = breader.readLine();
			int counter = 0;
			while (readline.contains("\t")) {
				counter++;
				int tab = readline.indexOf("\t".charAt(0));
				while (tab != -1) {
					String sub = readline.substring(0, tab);
					readline = readline.substring(tab+1, readline.length());
					switch(counter) {
					//Hier wird der Datensatz eingelesen
					}
					tab = readline.indexOf("\t".charAt(0));
					counter++;
				}
				myData.setasterix(readline);
				myData.setdatensatznummer(linecount);
				myData.setdatensatzid(Long.valueOf((String.valueOf(myData.getpop_number()) + String.valueOf(myData.getcancer_number()) + String.valueOf(myData.getage_group()) + String.valueOf(myData.getsex() + "10"))));
				mydata.add(myData);
			}
			readline = breader.readLine();
		}
		freader = new FileReader(readfile4);
		breader = new BufferedReader(freader, 65536);
		readline = breader.readLine();
		while (readline!=null) {
			linecount++;
			if (linecount%10000==0) {
				System.out.println("Wir sind in Zeile: " + linecount);
			}
			//readline = breader.readLine();
			int counter = 0;
			while (readline.contains("\t")) {
				counter++;
				int tab = readline.indexOf("\t".charAt(0));
				while (tab != -1) {
					String sub = readline.substring(0, tab);
					readline = readline.substring(tab+1, readline.length());
					switch(counter) {
					//Hier wird der Datensatz eingelesen
					}
					tab = readline.indexOf("\t".charAt(0));
					counter++;
				}
				myData.setasterix(readline);
				myData.setdatensatznummer(linecount);
				myData.setdatensatzid(Long.valueOf((String.valueOf(myData.getpop_number()) + String.valueOf(myData.getcancer_number()) + String.valueOf(myData.getage_group()) + String.valueOf(myData.getsex() + "10"))));
				mydata.add(myData);
			}
			readline = breader.readLine();
		}
		freader = new FileReader(readfile5);
		breader = new BufferedReader(freader, 65536);
		readline = breader.readLine();
		while (readline!=null) {
			linecount++;
			if (linecount%10000==0) {
				System.out.println("Wir sind in Zeile: " + linecount);
			}
			//readline = breader.readLine();
			int counter = 0;
			while (readline.contains("\t")) {
				counter++;
				int tab = readline.indexOf("\t".charAt(0));
				while (tab != -1) {
					String sub = readline.substring(0, tab);
					readline = readline.substring(tab+1, readline.length());
					switch(counter) {
					//Hier wird der Datensatz eingelesen.
					}
					tab = readline.indexOf("\t".charAt(0));
					counter++;
				}
				myData.setasterix(readline);
				myData.setdatensatznummer(linecount);
				myData.setdatensatzid(Long.valueOf((String.valueOf(myData.getpop_number()) + String.valueOf(myData.getcancer_number()) + String.valueOf(myData.getage_group()) + String.valueOf(myData.getsex() + "10"))));
				mydata.add(myData);
			}
			readline = breader.readLine();
		}
		System.out.println("Wir sind in Zeile: " + linecount);
		breader.close();
		freader.close();
		System.out.println("Reader geschlossen, Daten eingelesen");
		
	}

Das funktioniert soweit auch!
Allerdings geht er danach im Codetext nicht mehr weiter, sonder bleibt in einem Finalize hängen. (Ist mir erst beim Debuggen aufgefallen)
Java:
    private void runFinalizer() {
	synchronized (this) {
	    if (hasBeenFinalized()) return;
	    remove();
	}
	try {
	    Object finalizee = this.get();
	    if (finalizee != null && !(finalizee instanceof java.lang.Enum)) {
		invokeFinalizeMethod(finalizee);
		/* Clear stack slot containing this variable, to decrease
		   the chances of false retention with a conservative GC */
		finalizee = null;
	    }
	} catch (Throwable x) { }
	super.clear();
    }
und der Teil hier
Java:
public void run() {
	    for (;;) {
		try {
		    Finalizer f = (Finalizer)queue.remove();
		    f.runFinalizer();
		} catch (InterruptedException x) {
		    continue;
		}
	    }
	}
    }
Jemand ne idee?

mfG henpara
 
S

SlaterB

Gast
streiche alle Zeilen zu finalize?

am oberen Code fällt auf, dass du da 4x den gleichen langen komplizierten Block drinstehen hast, Untermethode?
 

henpara

Bekanntes Mitglied
am oberen Code fällt auf, dass du da 4x den gleichen langen komplizierten Block drinstehen hast, Untermethode?

jo hab ich auch schon überlegt, bisher noch zu faul dafür gewesen.

Zum Finalize, der code-teil is ja nicht von mir, sondern aus der Finalise.class, die er beim debuggen aus welchem Grund auch immer ansteuert.

Ich verstehe eh nicht, was es da zu finalizen gibt - daher auch keine Idee, wie ich das umgehen kann.
 
S

SlaterB

Gast
oh, nicht so gut gesehen von mir ;)
weißt du denn welche Codezeile als letztes von deinem Code drankommt, passiert es quasi am Ende der Methode?
wirklich was zu sagen habe ich dazu aber wohl leider nicht

edit:
ach, allgemeine Testkommentare:
taucht das Problem reproduzierbar immer auf?
verschwindet das Problem oder geht es schneller wenn du weniger Dateien einliest/ kürzere Dateien/ die Daten nicht selber irgendwo speicherst sondern nur einfach so durchiterierst?
 
Zuletzt bearbeitet von einem Moderator:

henpara

Bekanntes Mitglied
Ja, beim debuggen ist re reproduzierbar, allerdings beim normalen Aufrufen von "run" unter eclipse läuft das Programm weiter, als im Debug-Modus. (allerdings nach der Methode passiert auch nichts mehr, bzw. wird kein befehl mehr ausgeführt).

Weniger Daten werd ich auf jeden Fall noch probieren, updates dann aber wohl erst morgen, ich mach gleich Feierabend ;)

mfG

edit
werd dann noch n bischen mit den breakpoints rumspielen um das problem weiter eingrenzen zu können.
 

ARadauer

Top Contributor
jo hab ich auch schon überlegt, bisher noch zu faul dafür gewesen.
Echt? Und dass traust du dir in einem Forum zu schreiben?
Wenn du zu faul bist und eine Methode 5 mal kopierst.. bin ich zu faul mir deine 160 Zeilen Code durchzulesen... 40 wären ok gewesen ;-)

Also räum erstmla auf, veilleicht siehst du dann selber den Fehler, wenn nicht poste die methode nochmal..
 

henpara

Bekanntes Mitglied
hab jetzt nochmal etwas tiefer gegraben und umgebaut, und den finalize-fehler so beheben können. Es lag wohl am DB-Driver.

Aber schon nagt das nächste Problem, und zwar ein Iterator-Problem:
Java:
private ArrayList<String> doIt (ArrayList<Dataset> input) {
		ArrayList<String> myStmts = new ArrayList<String>();
		Iterator<Dataset> it = input.iterator();
		Dataset data;
		String stmttodb = "";
		int count = 0;
		while (it.hasNext()){
			count++;
			data = it.next(); //hier
			stmttodb += createStatmts(data) + ", " +  System.getProperty("line.separator");
			if (count % 1000 ==0) {
				myStmts.add(stmttodb);
				stmttodb = "";
				System.out.println(count + "Statements vorbereitet");
			}
		}
		myStmts.add(stmttodb);
		return myStmts;
	}
bei //hier ist das Problem und zwar nimmt er von der ArrayList input IMMER nur das letzte Element. also it.next() lieftert immer das gleiche Element zurück, nämlich das letzte aus der ArrayList.

Ich habe keine Ahnung warum, in jeder Info zu Iteratoren sieht man solche while-Schleifen, wie ich sie eingebaut habe.

Jemand eine Idee?

mfG
 
S

SlaterB

Gast
es ist nicht immer das letzte, jedenfalls nicht direkt, du bekommst schon genau das Objekt an der richtige Stelle,
nur hast du an jeder Position exakt DASSELBE Objekt stehen

mal eine Zeile mit genialen Variablennamen aus dem ersten Posting zitiert:
> mydata.add(myData);
myData wird nur einmal vor der Schleife erstellt, danach in jedem Schleifendurchlauf geadded und geändert,
durch das Einfügen in die Liste wird nicht per Zauberhand eine Kopie erstellt

gleiches Problem gerade:
http://www.java-forum.org/java-basics-anfaenger-themen/110917-problem-arraylist.html

----

da du jetzt in jedem Fall diesen Einlese-Block ändern musst, wäre es genial, diesen nur einmal im Programm zu haben,
sonst musst du jede Änderung bzw. den korrigierten Block insgesamt 4x kopieren, wehe das wird vergessen..
 
Zuletzt bearbeitet von einem Moderator:

henpara

Bekanntes Mitglied
joa, werd mich dran machen, danke für die Hilfe.

Der Fehler kam übrigens daher, daß oftmals gesagt wurde "new xy" würde die Performance drücken, daher hab ich gedacht: Vermeidest du am besten 500000 Objekte anzulegen...

Daß dadurch das ganze nicht mehr klappt, wird mir gerade siedendheiß klar :(

Also danke!

mydata.add(myData);
ja das mit den Variablennamen ist noch so ein Problem, da bin ich für Tipps offen.
Bin selber unzufrieden mit meinen Benennungen aber noch zu beschränkt solide Lösungen zu finden :/

edit: ok, werd das mal ändern und noch @aradauer: wo ist das Problem wenn man ehrlich ist? Natürlich gucke ich auch lieber auf einen übersichtlicheren code (is übrigens mittlerweile geändert) aber manchmal hat man eben noch andere Prioritäten.
 
Zuletzt bearbeitet:
S

SlaterB

Gast
ein Anfang wäre schon
> myDataList.add(myData);
besser, oder was immer mydata bisher war,

derselbe Name nur mit unterschiedlichen Groß/Kleinbuchstaben, das geht ja gar nicht
 
Zuletzt bearbeitet von einem Moderator:

KSG9|sebastian

Top Contributor
Oh juhu, wieder ne Diskussion ob Objekte erzeugen teuer ist oder nicht :)

Für die Zukunft:

Programmier das ganze einfach runter - so das es funktioniert. Gewisse Variablen dann durch eine Map/Cache/Factory u.s.w. zu ersetzen kannst du dann immer noch tun, aber für's erste sollte der Code tun, optimieren kannste dann immer noch.
 

henpara

Bekanntes Mitglied
jaja ist ja gut :shock: ich habs ja kapiert :pueh:

Passiert das ganze eigentlich auch, wenn ich mit String arbeite?
Also
Java:
ArrayList<String> al
String input = "";
while (irgendwas) {
input = jedesmalwasanderes;
al.add(input)
}
oder bekomm ich die gewünschte Liste mit wirklich verschiedenen Strings?

mfG
 
M

maki

Gast
Keine Ahnung ob ich deine Frage verstanden habe, aber Strings sind immutable, d.h. unveränderbar, jede Änderung erzeugt einen neuen String, vermeidet u.a. Aliasing Probleme.

Nochmals: In OOP Sprachen ist es vollkommen und absolut normal Objekte zu haben, wenn man welche braucht, erzeugt man welche ;)
 
S

SlaterB

Gast
in OOP liest man aber auch nicht ständig 570000 Datensätze ein, also schon erlaubt drüber nachzudenken

edit:
den Unterschied zwischen Objekt und String sieht man schon am Code:

> stringVaraible = jedesmalwasanderes;
ein (wahrscheinlich neuer) String wird zugewiesen

> myObject.set(jedesmalwasanderes);
myObject bleibt dasselbe, das String-Attribut intern wird dagegen wiederum jedesmal geändert
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
K finalize() Problem Java Basics - Anfänger-Themen 9
W Sinn von Konstruktorsyntax und finalize Java Basics - Anfänger-Themen 14
U Frage zu finalize() Java Basics - Anfänger-Themen 8
D finalize()-Methode wird nicht aufgerufen Java Basics - Anfänger-Themen 3
N Wann und wie oft finalize Methode verwenden( überschreiben ) Java Basics - Anfänger-Themen 6
G Frage zu Finalize - Methode Java Basics - Anfänger-Themen 4
R Größter zusammenhängender Block gleicher Zeichen im String Java Basics - Anfänger-Themen 1
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 0
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 5
D try/catch-Block bei for-Schleife Java Basics - Anfänger-Themen 14
Zwanglos Warum wird nur die erste Zeile im while Block ausgeführt? Java Basics - Anfänger-Themen 8
B Try-Catch Block Java Basics - Anfänger-Themen 3
F Mehrere Exceptions in einem Catch-Block abfangen Java Basics - Anfänger-Themen 12
E Synchronisierte Methoden vs. Synchronized(lockObject) Block Java Basics - Anfänger-Themen 7
A break; mit Einfluss hinter else if Block Java Basics - Anfänger-Themen 3
tsom Erste Schritte itext Text als Block auf neue Seite Java Basics - Anfänger-Themen 0
J Code in Try-Catch Block wird nicht komplett ausgeführt Java Basics - Anfänger-Themen 5
A Nicht zu findender Fehler in einem try/catch Block Java Basics - Anfänger-Themen 6
E Buchstaben verhindern / Try & Catch Block Java Basics - Anfänger-Themen 3
D if block mit equals im rumpf Java Basics - Anfänger-Themen 11
L Warum ist der catch-Block nicht erreichbar ? Java Basics - Anfänger-Themen 8
B Input/Output NIO: Block-Move Java Basics - Anfänger-Themen 14
T Threads Join() = Block? oO Java Basics - Anfänger-Themen 4
B Classpath static block - Verwirrung Java Basics - Anfänger-Themen 2
J Methoden Wert im Block einer for-Schleife wird nicht aktualisiert Java Basics - Anfänger-Themen 9
J Grosses einmaleins 5er Block Ausgabe Java Basics - Anfänger-Themen 3
S Schlüsselworte Thread Block sprerren Java Basics - Anfänger-Themen 8
H .class und static Block ? Java Basics - Anfänger-Themen 4
N Catch Block in Try erzwingen Java Basics - Anfänger-Themen 14
E Problem mit for schleife/ try-catch block Java Basics - Anfänger-Themen 7
S if-Block dynamisch aufbauen Java Basics - Anfänger-Themen 5
N try and catch block in finally Java Basics - Anfänger-Themen 8
A Datentypen problem return aus try-block Java Basics - Anfänger-Themen 4
D Scanner hasNext(Line)() Block Problematik... Java Basics - Anfänger-Themen 6
B Exception vor catch Block definieren Java Basics - Anfänger-Themen 9
V Was ist ein Try-Catch Block Java Basics - Anfänger-Themen 4
Z Applet mit einem beweglichem Block Java Basics - Anfänger-Themen 7
G static block und konstanten Java Basics - Anfänger-Themen 2
R wait() in synchronized - Block oder nicht? Java Basics - Anfänger-Themen 4
G Verschiedene Exceptions zu gleichem Block Java Basics - Anfänger-Themen 6
G InputStream im finally-Block schließen Java Basics - Anfänger-Themen 7
F reiner Code-Block Java Basics - Anfänger-Themen 6
G If-Block und String Java Basics - Anfänger-Themen 3
M Exception->mehrere Exceptions in einem Catch Block behand Java Basics - Anfänger-Themen 4
J JAVA-Problem blockiert MEDIATHEKVIEW Java Basics - Anfänger-Themen 13
D Java Fenster blockiert ? Java Basics - Anfänger-Themen 5
J paint-methode blockiert settings von JComponents Java Basics - Anfänger-Themen 5
U Inputstream.read()/readLine() blockiert immer Java Basics - Anfänger-Themen 18
W new FileInputStream() blockiert bei fifo (named pipe) Java Basics - Anfänger-Themen 2
N GUI wird durch while blockiert. ? Java Basics - Anfänger-Themen 8
hdi Thread blockiert -> warum? Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben