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
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);
}
}
}