|
|
|
|
Wer hat eigentlich diese Web of Knowledge Scheiße geschrieben?
Jetzt schon zum xten mal passiert, dass man sich mal ein Ergebnis irgendwo als Tab hingeschoben hat und dann Tage später anschauen möchte - nur egal wo man drauf klickt (z.B. auf F*CKIN* Full Text From Publisher): Web of Knowledge stellt fest, dass die Session hier jetzt ja wohl abgelaufen sei und führt einen zur Startseite. Ergebnisse wech. WTF
|
|
|
|
|
|
|
Thorlabs Abschwächer und Newport Mounts!?
Da kann ja nix rumkommen...wenigstens die HeNe Röhre selbst geblasen?
|
|
|
|
|
|
|
Hase, das ne Hohlfaser für SPM. Und die Abschwächer sind auf ner Webcam für selbstgebastelte pointing stabilisierung (die Lustigerweise immer noch besser funktioniert wie die kommerzielle...). Was du jetzt gegen die Newport Mounts hast weiß ich aber auch nicht?
|
|
|
|
|
|
Java
|
Wie starte ich elegant nen Thread in Java? Hintergrund:
|
Code: |
int funktionA(int b) {
//do something
return c;
}
int parallel(int d) {
int e = new Thread(funktionA(d));
return e;
}
|
|
Habe es mit nem Lambda versucht (irgendwas a la Runnable foo = () -> { funktionA(d); }; ), allerdings muss dann das e final sein und nen Wert returnen/zurueckschreiben aus dem Lambda hab ich dann auch nicht hinbekommen. Wie mache ich?
|
|
|
|
|
|
|
|
|
|
|
Das sieht ja ziemlich gut aus. Jetzt ist aber meine parallel-Funktion zusaetzlich noch static, was ich gern behalten wuerde. Ich muss dem FutureTask aber n Callable geben, wie stell ich das an, das ist mir noch nicht so klar.
|
|
|
|
|
|
|
Wer fordert, dass topologische Räume nichtleer sind, hat die Kontrolle über seine Mathematik verloren.
|
|
|
|
|
|
|
Sieht dann jetzt so aus:
|
Code: |
FutureTask<Integer> future1 = new FutureTask<>(new Callable<Integer>() {
public Integer call() {
return funktionA(input);
}
});
|
|
Funktioniert. Falls das aber jemand noch schicker (Lambda?!) hinbekommt, wuerd ich es mir gern ansehen.
|
|
|
|
|
|
|
| Zitat von RichterSkala
Hase, das ne Hohlfaser für SPM. Und die Abschwächer sind auf ner Webcam für selbstgebastelte pointing stabilisierung (die Lustigerweise immer noch besser funktioniert wie die kommerzielle...). Was du jetzt gegen die Newport Mounts hast weiß ich aber auch nicht?
| |
Gar nix.
Dachte, du würdest da Thorlabs Zeug reinschrauben. Da friert ja im Labor die Hölle zu.
Die Webcam dient nur zur Pointing-Stabilisierung? Also keine Strahlprofilvermessung? Da hätte ich ein bisschen Schiss vor thermischen Linsen in den Abschwächern. Mit wie viel Leistung belastet du die?
Korrigierst du nur Winkel oder auch Offsets von der (theoretischen) optischen Achse deines Strahlengangs?
|
|
|
|
|
|
|
| Zitat von MCignaz
Sieht dann jetzt so aus:
|
Code: |
FutureTask<Integer> future1 = new FutureTask<>(new Callable<Integer>() {
public Integer call() {
return funktionA(input);
}
});
|
|
Funktioniert. Falls das aber jemand noch schicker (Lambda?!) hinbekommt, wuerd ich es mir gern ansehen.
| |
|
Code: |
FutureTask<Integer> future1 = new FutureTask<>(() -> funktionA(input));
|
|
?
|
|
|
|
|
|
|
| Zitat von horscht(i)
Gar nix.
Dachte, du würdest da Thorlabs Zeug reinschrauben. Da friert ja im Labor die Hölle zu.
Die Webcam dient nur zur Pointing-Stabilisierung? Also keine Strahlprofilvermessung? Da hätte ich ein bisschen Schiss vor thermischen Linsen in den Abschwächern. Mit wie viel Leistung belastet du die?
Korrigierst du nur Winkel oder auch Offsets von der (theoretischen) optischen Achse deines Strahlengangs?
| |
Die kriegen nen Reflex von ner Glasplatte ab, durch die etwa 3mJ durch geht, also vielleicht 1-3% davon? Nie gemessen Der Strahl ist fokusierend, ballert also schon gut auf den Chip, aber bisher hält er und bei der billig Webcam ist das egal. Die Webcam macht minimal auf Strahlprofil. Aber nur so weit, dass man sieht wenn der Strahl vorher irgendwo clipt. Das Lasersystem liefert aber eh ne beschissene Mode Ein Glück macht das die Glasfaser etwas sauber. Unser eigentlicher Beamprofiler hat bessere Abschwächer - aber der Chip ist dafür schon ganz schön krass durchlöchert
Das System stammt von meinem Vorgänger, der hatte das mal doppelt aufgebaut, um auch die Offsets korrigieren zu können, so wird das wohl hauptsächlich nur den Winkel korrigieren. Wir haben eigentlich ein teures System gekauft, dass schön beides mit PID, Piezo+Stepper und shot-to-shot macht, aber das Ding ist so over engineered, dass das noch keiner gut zum laufen bekommen hat.
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von RichterSkala am 04.05.2016 2:15]
|
|
|
|
|
|
| Zitat von PutzFrau
| Zitat von MCignaz
Sieht dann jetzt so aus:
|
Code: |
FutureTask<Integer> future1 = new FutureTask<>(new Callable<Integer>() {
public Integer call() {
return funktionA(input);
}
});
|
|
Funktioniert. Falls das aber jemand noch schicker (Lambda?!) hinbekommt, wuerd ich es mir gern ansehen.
| |
|
Code: |
FutureTask<Integer> future1 = new FutureTask<>(() -> funktionA(input));
|
|
?
| |
Funzt, danke. Kannst du noch erklaeren, warum das funktioniert? Ich bin davon ausgegangen, dass ich FutureTask ein Objekt mitgeben muss, das Callable implementiert.
/Ich benutze jetzt ein Future, das ich dem ThreadPool submitte:
|
Code: |
pool.submit( () -> funktionA(input) ); |
|
Nen ExecutorService brauche ich schon bei FutureTask, oder?
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von MCignaz am 04.05.2016 8:54]
|
|
|
|
|
|
Das Lambda ist in diesem Fall Callable. Resulttype ist inferred.
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von SwissBushIndian am 04.05.2016 8:39]
|
|
|
|
|
|
Danke. Muss mir das wohl mal naeher ansehen.
|
|
|
|
|
|
|
Ok, naechste Frage. Ich moechte eine ArrayList<ArrayList<T>>(n) haben. Wie initialisiert man das vernuenftig, sprich wie kann ich beim Initialisieren gleich n viele leere ArrayLists in meiner ArrayList haben. Da loopt man doch bestimmt nicht durch und macht add new ArrayList<T>(), oder?
|
|
|
|
|
|
|
Doch
Wenn ich Generics richtig im Kopf habe, wäre die saubere Deklaration sowas: List<List<Sonstwas>> var = new ArrayList<List<Sonstwas>>
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von csde_rats am 04.05.2016 9:47]
|
|
|
|
|
|
Und dann n mal add? Hmpf, nagut.
|
|
|
|
|
|
|
Die Frage ist auch, wofür du das brauchst? Bei Collections von Collection werde ich immer hellhörig.
|
|
|
|
|
|
|
| Zitat von horscht(i)
| Zitat von RichterSkala
Hase, das ne Hohlfaser für SPM. Und die Abschwächer sind auf ner Webcam für selbstgebastelte pointing stabilisierung (die Lustigerweise immer noch besser funktioniert wie die kommerzielle...). Was du jetzt gegen die Newport Mounts hast weiß ich aber auch nicht?
| |
Gar nix.
Dachte, du würdest da Thorlabs Zeug reinschrauben. Da friert ja im Labor die Hölle zu.
| |
Gibts da ein Problem?
Bin gerade auf deren Website und such Zeugs zusammen
|
|
|
|
|
|
|
Ich bau fuer ne Uni-Aufgabe nen parallelen Mergesort mit variabel bestimmter Anzahl von Threads. Dazu splitte ich die urspruengliche Liste #Threads viele Listen auf. Die ganze Funktion schaut so aus:
|
Code: |
public static <T extends Comparable<T>> ArrayList<T> parallelSort(ArrayList<T> input, int numberOfThreads) {
if(input.size() <= 1) return input;
ArrayList<ArrayList<T>> chunks = new ArrayList<>();
for(int i = 0; i < numberOfThreads; ++i) chunks.add(new ArrayList<>());
int position = 0;
while (!input.isEmpty()) {
chunks.get(position).add(input.remove(0));
position = (position + 1) % numberOfThreads;
}
ExecutorService pool = Executors.newFixedThreadPool(numberOfThreads);
ArrayList<Future<ArrayList<T>>> futures = new ArrayList<>();
for(ArrayList<T> chunk : chunks) futures.add(pool.submit(() -> sort(chunk)));
ArrayList<T> results = new ArrayList<>();
for(Future<ArrayList<T>> future : futures) {
try {
results = merge(results, future.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
pool.shutdown();
return results;
}
|
|
Funktionieren tuts schonmal.
|
|
|
|
|
|
|
| Zitat von gloerk
| Zitat von horscht(i)
| Zitat von RichterSkala
Hase, das ne Hohlfaser für SPM. Und die Abschwächer sind auf ner Webcam für selbstgebastelte pointing stabilisierung (die Lustigerweise immer noch besser funktioniert wie die kommerzielle...). Was du jetzt gegen die Newport Mounts hast weiß ich aber auch nicht?
| |
Gar nix.
Dachte, du würdest da Thorlabs Zeug reinschrauben. Da friert ja im Labor die Hölle zu.
| |
Gibts da ein Problem?
Bin gerade auf deren Website und such Zeugs zusammen
| |
Nein, ich erzähle nur Blödsinn und witzel ein wenig rum.
Achte einfach drauf, ob wirklich alles zöllig oder wirklich alles metrisch bemast ist. Dann gehts gut.
|
|
|
|
|
|
|
Classic mistake.
Aber das Thorlabszeug ist manchmal billo. Oftmals auch gut (und man kriegt die Snacks dazu ), aber manchmal auch billo.
|
|
|
|
|
|
|
Ich teste den MergeSort gerade, bis zu nem 10.000-elementigen Array funktioniert der problemlos, aber 1.000.000 Elemente laeuft der unendlich, bei zwei Threads.
Liegts an der Heapsize?
/Ok wird doch fertig, dafür brauchts ewig, bis er das Sortieren beginnt. Dunno.
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von MCignaz am 04.05.2016 13:40]
|
|
|
|
|
|
Der muss halt erstmal den input in Teile hacken, was ja nicht nebenläufig passiert bei dir.
|
Code: |
while (!input.isEmpty()) {
chunks.get(position).add(input.remove(0));
position = (position + 1) % numberOfThreads;
}
|
|
/edit:
Geht es hier darum Mergesort schneller zu machen oder darum ein nebenläufiges Mergesort zu implementieren?
/fakeedit:
Wer Nebenläufigkeit mit Java lehrt gehört gepaddelt.
|
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von no.cigar am 04.05.2016 14:39]
|
|
|
|
|
|
Ohne die genauen Java-APIs zu kennen, hat das von dir zitierte Codestück wahrscheinlich ohnehin quadratische Komplexität, da remove wahrscheinlich linear ist und linear oft aufgerufen wird. Damit wird der gesamte Algorithmus dominiert von dieser einen While-Schleife und die Parallelisierung bringt (asymptotisch) nichts.
|
|
|
|
|
|
|
Ja, genau die Schleife hab ich auch als evil identifiziert, da muss ich nochmal ran.
Was mich allerdings noch etwas verwirrt, ist, dass wenn ich in ner For-Schleife den Algorithmus für aufsteigende Threadanzahlen aufrufe und die Zeit messe, ich nur Ergebnisse für ein und zwei Threads bekomme, alles andere ist 0. Wie kommt das?
/no.cigar: Nebenläufiges Mergesort mit beliebiger Anzahl von Threads.
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von MCignaz am 04.05.2016 15:11]
|
|
|
|
|
|
Dann lies dir nochmal genau durch wie der "divide"-Teil funktionieren sollte für diesen Algorithmus. (Hint: O=log(n))
Zum Testscenario:
Ich vermute mal das du durch Array.remove() deinen "input" leer machst, bin aber nicht so fit in den Java-Eigenheiten beim Arrayhandling.
|
|
|
|
|
|
|
| Zitat von MCignaz
|
Code: |
if(input.size() <= 1) return input;
ArrayList<ArrayList<T>> chunks = new ArrayList<>();
for(int i = 0; i < numberOfThreads; ++i) chunks.add(new ArrayList<>());
int position = 0;
while (!input.isEmpty()) {
chunks.get(position).add(input.remove(0));
position = (position + 1) % numberOfThreads;
}
|
|
| |
Warum löschst du überhaupt die Elemente aus dem input und fügst sie einzeln den einzelnen Listen hinzu? Mache dir eine Liste von Indizes, die Start und Ende der jeweiligen Teilliste indizieren oder eine Liste, die Views auf Teillisten enthält, e.g.
|
Code: |
int size = input.size();
int chunkSize = size / numberOfThreads;
ArrayList<List<T>> chunks = new ArrayList<>();
for( int i = 0; i < size; i += chunkSize ) chunks.add( input.subList( i, Math.min( i + chunkSize, size ) );
|
|
Sowas in der Art. Habe es nicht getestet, da direkt ins Forum getippt, aber sollte klar sein.
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von PutzFrau am 04.05.2016 16:09]
|
|
|
|
|
|
Das dem Mergesort angehörende Divide geschieht in sort(). Ich hacke in parallelSort erstmal die Input-Liste in #Threads viele Stücke, und lass die Threads dann mit diesen Teilstücken nen normalen Mergesort machen. Am Ende merge ich alle sortierten Listen nochmal zusammen.
/Putze: Genau so hatte ich das vorher. Allerdings hatte ich dann das Problem, dass ich aufgrund der Integerdivision nicht alle Elemente erwischt habe (11 Elemente, 4 Threads, 3 Elemente fielen hinten runter). Dann dachte ich: Hauste den Rest am Anfang oder Ende an einen der Chunks dran, was dann aber dazu führte, dass eine Liste dann relativ lang werden konnte.
Dann fiel mir die jetzige Lösung ein, die das alles so schön gleichmäßig verteilt.
Aber seine Reaktion, als er von der quadratischen Laufzeit erfuhr, war unglaublich
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von MCignaz am 04.05.2016 15:38]
|
|
|
|
|
|
| Zitat von MCignaz
Das dem Mergesort angehörende Divide geschieht in sort(). Ich hacke in parallelSort erstmal die Input-Liste in #Threads viele Stücke, und lass die Threads dann mit diesen Teilstücken nen normalen Mergesort machen. Am Ende merge ich alle sortierten Listen nochmal zusammen.
| |
"in #Threads viele Stücke hacken" "Mergesort angehörende Divide"
|
|
|
|
|
|
Thema: pOT-lnformatik, Mathematik, Physik XIX ( zuviel Geld über? mehr Geräte kaufen! ) |