Threading und Rekursion führen zu “GC overhead limit exceeded”

  • Themenstarter Themenstarter Rolf46
  • Beginndatum Beginndatum
R

Rolf46

Gast
Hallo!

Ich habe den Fastcut Algorithmus zur berechnung des minimalen Schnitts in Graphen implementiert.
Um meine 4cores auszunutzen hab ich dies auf Threads verteilt.

Das problem ist folgendes:
Ich habe einen Startthread, welcher Den Ausgangsgraphen zwei mal jeweils um x-Kanten reduziert.
Damit erhält man zwei neue Graphen H1,H2.

Diese gebe ich als Input in 2 neue Threads und lasse diese stehts rekusiv so weiter rechnen, bis der Graph nur noch 2Knoten besitzt.
Anschließend werden immer die beiden letzten Graphen verglichen und der kleinere Schnitt zurückgegeben...

Das Problem ist dass die Threadmenge quadratisch ansteigt und ich nach einer Weile einen “GC overhead limit exceeded” error bekomme...
Ich habe auch schon in der eclipse.ini die Werte geändert:

-Xms8000m
-Xmx8000m
--launcher.XXMaxPermSize
8000m
--launcher.XXMaxPermSize
8000M

Das bringt leider auch nichts...

Hat jemand einen Rat?



Hier einmal der Code der runmethode des Threads
Java:
public void run() {
		int n = G.getVertexCount();
		UndirectedSparseMultigraph<Integer, Double> H1;
		UndirectedSparseMultigraph<Integer, Double> H2;

		if (n == 2) {
			Contract contract1 = new Contract(G, 2);
			contract1.calcMinCut();
			mincut = G.getEdges();
		} else {
			try {
				double t = n / sqrtTwo;
				UndirectedSparseMultigraph<Integer, Double> G2 = (UndirectedSparseMultigraph<Integer, Double>) DeepCopy.copy(G);
				Contract contract1 = new Contract(G, t);
				Thread t1 = new Thread(contract1);
				t1.setPriority(Thread.MAX_PRIORITY);
				t1.start();

				Contract contract2 = new Contract(G2, t);
				Thread t2 = new Thread(contract2);
				t2.setPriority(Thread.MAX_PRIORITY);
				t2.start();

				t1.join();
				t2.join();

				H1 = contract1.G;
				H2 = contract2.G;
				
				FastCut fc1 = new FastCut(H1, t);
				Thread fcT1 = new Thread(fc1);
				fcT1.start();

				FastCut fc2 = new FastCut(H2, t);
				Thread fcT2 = new Thread(fc2);
				fcT2.start();

                                //Lege thread schlafen bis Rekusrion fertig ist
				fcT1.join();
				fcT2.join();

                                //vergleich beide Ergebnisse und nehme kleineren Schnitt
				mincut = fc1.mincut.size() < fc2.mincut.size() ? fc1.mincut : fc2.mincut;

			} catch (Exception e) {
				System.out.println(e);
			}
		}
	}
 
Solltest mal diese oder ähnliche Werte für die Run Configuration einsetzen, eclipse.ini bezieht sich auf Eclipse selber.
 
Ich empfehle mal einen ThreadPool(executor) de maximal doppeltsoviele Threads wie cores(aka Hyperthreading) hat.
-> Kein quadratischer ansteig der Threads mehr, und geringerer Overhead
 

Neue Themen


Zurück
Oben