Hallo,
ich arbeite derzeit mit 400.000 Objekten.
ich habe eine arraylist mit 1000 objekten, auf die sich die 400.000 objekte aufteilen nach einem algorithmus (kmeans).
beispiel:
Vektoren in Centroid949: 685
Vektoren in Centroid950: 361
Vektoren in Centroid951: 684
Vektoren in Centroid952: 190
Vektoren in Centroid953: 125
bei diesen vektoren handelt es sich um 128 dim vektoren.
für jedes objekt in der arraylist, also für alle objekte pro objekt in der arraylist muss ich mittelwerte bestimmen, abgleichen, neusetzten und wieder in eine gewisse whileschleife bis sie irgendwann breaked.
meine frage:
ich habe als ersten ansatz die arraylist durchlaufen(iterativ), hab also 1000 objekte, die ich sequentiell durchlaufe und dort mittelwerte berechne. hier wird nur ein cpu kern genutzt. im kleintest-format hab ich (anstatt 1000 objekten auf die sich 400.000 verteilen nur 3 objekte auf die sich die 400.000) verteilen eine rechnezeit von: 3m 45s.
2ter und 3ter ansatz(nachgelesen windows "native" threads was perfekt ist denke ich (kann linux wohl scheinbar nicht hehehehehehe(sorry musste sein ;P)) :
im 2ten ansatz: da für jedes objekt die selbe rechnung getätigt wird und die ereignisse auch in diesem schritt unabhängig sind, kam mir die idee mit threads. bei 3 objekten(die die 400.. blabla) hatte ich es so programmiert dass ich 3 threads gleichzeit habe, für jedes objekt 1 thread und mit join() auf die langsamsten gewartet (muss sein!). rechenzeit hier: 1m 45s.
im 3ten ansatz: weil meine cpu 2 kerne hat, war die idee immer nur 2 objekte gleichzeit anzusehen, also immer nur 2 threads zu starten, in dem sinne wenn ich 4 objekte habe, erst die ersten beiden rechnen, dann die nächsten beiden. rechenzeit hier: 2m 20s (für 3 objekte wie in den anderen ansätzen).
------
für mich klingt es komisch, "1000" threads zu erstellen (weil ich ja nun anstatt 3 obj nun 1000 nehme)
da die rechenzeit scheinbar nicht linear sondern exponentiell erscheint, soll ich nun 1000 threads erstellen ODER sequentiell durchlaufen lassen?
sind 1000 threads nicht ein bissl viel?
ich lasse derzeit mein prog laufen mit 1000 threads, das prog läuft seit 12 std und meiner vermutung nach noch so ca. 3 std. blockieren sich sooooo viele threads nicht gegenseitig ohne ende?
allgemeiner ablauf des programmteils:
--
whileschleife
1000 threads erstellen
berechnen
keine änderung = break
eine oder mehr änderungen = wieder in die whileschleife (d.h. wieder 1000 neue threads erstellen)
--
allgemeine settings:
OS: windows 8 customer edition
CPU: E2200 64bit 2,2ghz (2 kerne) oc auf 2,64 ghz , 1 MB lvl 2 cache.
RAM: 7 GB dd2
java settings:
-Xms4000m -Xmx4000m -XX:MaxPermSize=2500m
also 1000 threads gleichzeitig oder sequentiell?
danke für antworten & mfg
vimar
ich arbeite derzeit mit 400.000 Objekten.
ich habe eine arraylist mit 1000 objekten, auf die sich die 400.000 objekte aufteilen nach einem algorithmus (kmeans).
beispiel:
Vektoren in Centroid949: 685
Vektoren in Centroid950: 361
Vektoren in Centroid951: 684
Vektoren in Centroid952: 190
Vektoren in Centroid953: 125
bei diesen vektoren handelt es sich um 128 dim vektoren.
für jedes objekt in der arraylist, also für alle objekte pro objekt in der arraylist muss ich mittelwerte bestimmen, abgleichen, neusetzten und wieder in eine gewisse whileschleife bis sie irgendwann breaked.
meine frage:
ich habe als ersten ansatz die arraylist durchlaufen(iterativ), hab also 1000 objekte, die ich sequentiell durchlaufe und dort mittelwerte berechne. hier wird nur ein cpu kern genutzt. im kleintest-format hab ich (anstatt 1000 objekten auf die sich 400.000 verteilen nur 3 objekte auf die sich die 400.000) verteilen eine rechnezeit von: 3m 45s.
2ter und 3ter ansatz(nachgelesen windows "native" threads was perfekt ist denke ich (kann linux wohl scheinbar nicht hehehehehehe(sorry musste sein ;P)) :
im 2ten ansatz: da für jedes objekt die selbe rechnung getätigt wird und die ereignisse auch in diesem schritt unabhängig sind, kam mir die idee mit threads. bei 3 objekten(die die 400.. blabla) hatte ich es so programmiert dass ich 3 threads gleichzeit habe, für jedes objekt 1 thread und mit join() auf die langsamsten gewartet (muss sein!). rechenzeit hier: 1m 45s.
im 3ten ansatz: weil meine cpu 2 kerne hat, war die idee immer nur 2 objekte gleichzeit anzusehen, also immer nur 2 threads zu starten, in dem sinne wenn ich 4 objekte habe, erst die ersten beiden rechnen, dann die nächsten beiden. rechenzeit hier: 2m 20s (für 3 objekte wie in den anderen ansätzen).
------
für mich klingt es komisch, "1000" threads zu erstellen (weil ich ja nun anstatt 3 obj nun 1000 nehme)
da die rechenzeit scheinbar nicht linear sondern exponentiell erscheint, soll ich nun 1000 threads erstellen ODER sequentiell durchlaufen lassen?
sind 1000 threads nicht ein bissl viel?
ich lasse derzeit mein prog laufen mit 1000 threads, das prog läuft seit 12 std und meiner vermutung nach noch so ca. 3 std. blockieren sich sooooo viele threads nicht gegenseitig ohne ende?
allgemeiner ablauf des programmteils:
--
whileschleife
1000 threads erstellen
berechnen
keine änderung = break
eine oder mehr änderungen = wieder in die whileschleife (d.h. wieder 1000 neue threads erstellen)
--
allgemeine settings:
OS: windows 8 customer edition
CPU: E2200 64bit 2,2ghz (2 kerne) oc auf 2,64 ghz , 1 MB lvl 2 cache.
RAM: 7 GB dd2
java settings:
-Xms4000m -Xmx4000m -XX:MaxPermSize=2500m
also 1000 threads gleichzeitig oder sequentiell?
danke für antworten & mfg
vimar
Zuletzt bearbeitet: