Damit klappen die ersten Teile der Analyse schonmal ganz gut. Also z.B. das Einlesen und das Sortieren der Zeileneinträge. Bei der Abschlussanalyse scheint aber sogar der Server in die Knie zu gehen .– Dual Xeon Multi-Core Motherboard, Intel C602 Chipsatz, SATA
– 2x Intel Xeon Six-Core E5-2620(2 GHz, 72. GT/s QPI, 95W)
– 64 GB DDR3 SDRAM, 1333 MHz (8 x 8GB)
Der code ist ziemlich trivial. Geht nur ums im Endeffekt quadratische Vergleichen von 13 Mio Zeilen. Hab das ganze jetzt mal auf einen server mit ner Menge Rechenleistung gepackt :>.
Damit klappen die ersten Teile der Analyse schonmal ganz gut. Also z.B. das Einlesen und das Sortieren der Zeileneinträge. Bei der Abschlussanalyse scheint aber sogar der Server in die Knie zu gehen .
PS: Was hat es mit -server auf sich? War das ein Witz oder funktioniert das Kommando wirklich? Würde gerne mal nachlesen was das Kommando bewirkt. Googlesuchen alla '-server vm java' haben mir jetzt noch nicht wirklich weiter geholfen.
Drei mal darfst du raten was du Google sagst wenn du ein Minus vor einen Suchbegriff schreibst...PS: Was hat es mit -server auf sich? War das ein Witz oder funktioniert das Kommando wirklich? Würde gerne mal nachlesen was das Kommando bewirkt. Googlesuchen alla '-server vm java' haben mir jetzt noch nicht wirklich weiter geholfen.
for (int i = 0; i < keysize - 1; i++) {
for (int j = i + 1; j < keysize; j++) {
if (id1.get(i).equals(id1.get(j))) {
//id1, id2 und values sind Listen die über den Index verknüpft sind. Sie sind nach value absteigend sortiert und haben jeweils die Größe 'keysize'.
id1.remove(j);
id2.remove(j);
values.remove(j);
keysize--;
j--;
} else {
if (id2.get(i).equals(id2.get(j))) {
id1.remove(j);
id2.remove(j);
values.remove(j);
keysize--;
j--;
}
}
}
}
ID1,ID2,Gewicht
10,55,53.22345
24,66,52.2123
....
13,51,-99.34342
111,222,-103.2123
[15:31:02]: 0 Links wurden bisher auf *-Links geprüft.Dabei wurden 0 *-Links entfert. 13643786 Links gibt es noch zu prüfen.
[15:31:21]: 10 Links wurden bisher auf *-Links geprüft.Dabei wurden 290 *-Links entfert. 13643496 Links gibt es noch zu prüfen.
[15:32:40]: 20 Links wurden bisher auf *-Links geprüft.Dabei wurden 4298 *-Links entfert. 13639488 Links gibt es noch zu prüfen.
[15:34:33]: 30 Links wurden bisher auf *-Links geprüft.Dabei wurden 11326 *-Links entfert. 13632460 Links gibt es noch zu prüfen.
[15:35:58]: 40 Links wurden bisher auf *-Links geprüft.Dabei wurden 16842 *-Links entfert. 13626944 Links gibt es noch zu prüfen.
oh, umso besser, mit verschiedenen Listen nicht ganz so leicht,Damit klappen die ersten Teile der Analyse schonmal ganz gut. Also z.B. das Einlesen und das Sortieren der Zeileneinträge.
package javaforum;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;
public class WeightEdgeRemoval
{
public static void main(String[] args)
{
int keysize = 100000;
WeightEdgeRemoval w = new WeightEdgeRemoval();
w.generate(keysize);
long before = 0;
long after = 0;
System.out.println("Before");
w.print(10);
before = System.nanoTime();
w.cleanup1();
after = System.nanoTime();
System.out.println("Duration1 "+(after-before)/1e6);
System.out.println("After1");
w.print(10);
w.generate(keysize);
before = System.nanoTime();
w.cleanup2();
after = System.nanoTime();
System.out.println("Duration2 "+(after-before)/1e6);
System.out.println("After2");
w.print(10);
}
int keysize;
List<Integer> id1;
List<Integer> id2;
List<Double> values;
public WeightEdgeRemoval()
{
}
void generate(int keysize)
{
this.keysize = keysize;
Random random = new Random(0);
class Link implements Comparable<Link>
{
int id1;
int id2;
double value;
@Override
public int compareTo(Link o)
{
return Double.compare(o.value, value);
}
}
List<Link> links = new ArrayList<Link>();
int numIds = keysize / 16; // Guess...
for (int i=0; i<keysize; i++)
{
Link link = new Link();
link.id1 = random.nextInt(numIds);
link.id2 = random.nextInt(numIds);
link.value = random.nextDouble() * 100;
links.add(link);
}
Collections.sort(links);
id1 = new ArrayList<Integer>();
id2 = new ArrayList<Integer>();
values = new ArrayList<Double>();
for (int i=0; i<keysize; i++)
{
Link link = links.get(i);
id1.add(link.id1);
id2.add(link.id2);
values.add(link.value);
}
}
private void print(int n)
{
for (int i=0; i<Math.min(n, id1.size()); i++)
{
System.out.printf("%5d %5d %8.3f\n", id1.get(i), id2.get(i), values.get(i));
}
}
void cleanup1()
{
for (int i = 0; i < keysize - 1; i++)
{
for (int j = i + 1; j < keysize; j++)
{
if (id1.get(i).equals(id1.get(j)))
{
// id1, id2 und values sind Listen die über den Index
// verknüpft sind. Sie sind nach value absteigend sortiert
// und haben jeweils die Größe 'keysize'.
id1.remove(j);
id2.remove(j);
values.remove(j);
keysize--;
j--;
}
else
{
if (id2.get(i).equals(id2.get(j)))
{
id1.remove(j);
id2.remove(j);
values.remove(j);
keysize--;
j--;
}
}
}
}
}
void cleanup2()
{
class IntPair
{
private int i0;
private int i1;
IntPair(int i0, int i1)
{
this.i0 = i0;
this.i1 = i1;
}
@Override
public int hashCode()
{
return i0 ^ i1;
}
@Override
public boolean equals(Object object)
{
if (object instanceof IntPair)
{
IntPair other = (IntPair)object;
return
(i0 == other.i0 && i1 == other.i1) ||
(i0 == other.i1 && i1 == other.i0);
}
return false;
}
}
Map<Integer, Double> maxWeights =
new LinkedHashMap<Integer, Double>((int)(1.4*keysize));
Map<IntPair, Double> map =
new LinkedHashMap<IntPair, Double>((int)(1.4*keysize));
for (int i = 0; i < keysize; i++)
{
Integer i1 = id1.get(i);
Integer i2 = id2.get(i);
Double value = values.get(i);
Double w1 = maxWeights.get(i1);
if (w1 == null || w1 < value)
{
maxWeights.put(i1, value);
}
Double w2 = maxWeights.get(i2);
if (w2 == null || w2 < value)
{
maxWeights.put(i2, value);
}
}
for (int i = 0; i < keysize; i++)
{
Integer i1 = id1.get(i);
Integer i2 = id2.get(i);
Double value = values.get(i);
Double w1 = maxWeights.get(i1);
Double w2 = maxWeights.get(i2);
Double max = Math.max(w1, w2);
if (value >= max)
{
IntPair ip = new IntPair(i1, i2);
map.put(ip, value);
}
}
id1.clear();
id2.clear();
values.clear();
for (Entry<IntPair, Double> entry : map.entrySet())
{
IntPair ip = entry.getKey();
id1.add(ip.i0);
id2.add(ip.i1);
values.add(entry.getValue());
}
}
}