Read / Write Zyklen

LL0rd

Erfahrenes Mitglied
Hallo Leute,

ich habe ein Programm gebaut, das Daten parallel verarbeiten kann. Das ganze Programm macht folgendes.

Ich habe eine "Datenbank", die Objekte beinhaltet, es ist im Grunde nur eine Liste.

Start
64 Threads mit Berechnungen starten
Warten, bis alle 64 Threads die Berechnung abgeschlossen haben

Schleife, in der alle von den Threads erzeugten Objekte durchgegangen werden und die neu erstellten Objekte in die Hauptdatenbank eingetragen werden.

Gehe wieder zu Start.

So, nun habe ich folgendes Problem, es kann passieren, dass einige Threads für die Berechnung länger brauchen als andere. Jetzt können z.B. 63 Threads darauf warten, bis ein Thread noch rechnet. Deshalb würde ich gerne Read / Write Zyklen einführen in dennen auf diese Liste zugegriffen werden kann. Gibt es da irgendwelche "guten" Ansätze um so etwas zu realisieren?
 
Hi,

Lesen und schreiben die Threads bzw. deren Ergebnisse in die selbe DB ?
Und die Berechnung geschieht intern in den Threads ?
Greifen sie mehrmals auf die DB zu während ihrer Berechnung oder nur einmal bei Start ?


Wieso machst du keinen Thread / Backroundworker für den Write Zyklus ?


Hol die Sachen aus der DB (nur dafür brauchst du eine Verriegelung).
Sobald deine Threads laufen startest du den Backroundworker der eine Liste checkt mit Ergebnissen.
Ist was drin - schreibe in DB. Es greift ja keiner mehr drauf zu.

Und sobald ein Thread mit Ergebnissen / Objekten fertig ist - haut er die in diese Liste.
Quasi eine Art Scheduler der nur diese Liste mit Ergebnissobjekten prüft.
So kann ein Objekt sofort geschrieben werden ohne das es mit einem anderen kollidiert.
aber vorsicht falls sich ergebnisse beeiflussen.

Und der Worker wird angehalten wenn ein Thread gestartet wird solange er aus der DB liest.
Evt. mußt du das Lesen aus der DB heraus nehmen und nur die Berechnung im Thread machen.

quasi lesen aus der db und füllen der Threads.
worker laufen lassen und alle threads starten.
alle threads fertig und liste leer == worker stoppen.

Darf man fragen wie lange so eine einzelne Berechnung ist ? Also ein Thread ?

mfg
Martin
 
Lesen und schreiben die Threads bzw. deren Ergebnisse in die selbe DB ?

Also die Threads greifen die ganze Zeit auf die Datenbank zu, aber nur lesend. Ein Thread bekommt die volle Datenbank als Pointer übergeben. Ein Schreibzugriff erfolgt erst in dem Hauptthread, nachdem alle Berechnungen abgelaufen sind bzw. bevor es in die nächste Runde geht.

Und die Berechnung geschieht intern in den Threads ?

Richtig. Ein Thread rechnet mit der vollen Datenbank. Ein Thread bekommt die Aufgabe und versucht diese mit den Objekten in der Datenbank zu lösen. Dabei entstehen neue Objekte, die dann in eine Liste kommen. Anschließend sollen diese neuen Objekte auch anderen Threads zur Verfügung stehen, somit sollten die irgendwann mal in die Hauptdatenbank geschrieben werden. Dazu muss ich noch anmerken, dass keine Objekte in der Datenbank doppelt vorhanden sein dürfen. Dazu habe ich eine isEqual() Methode geschrieben.

Greifen sie mehrmals auf die DB zu während ihrer Berechnung oder nur einmal bei Start ?

Ja, wie bereits gesagt, greife ich lesend permanent zu, schreibend nur am Ende. Und genau das will ich jetzt ändern. Ich möchte auch während der Laufzeit schreibend auf die Datenbank zugreifen können.

Wieso machst du keinen Thread / Backroundworker für den Write Zyklus ?

Ja, genau das hatte ich auch vor, nur muss ich die Datenbank vorher irgendwie locken.

Hol die Sachen aus der DB (nur dafür brauchst du eine Verriegelung).
Sobald deine Threads laufen startest du den Backroundworker der eine Liste checkt mit Ergebnissen.
Ist was drin - schreibe in DB. Es greift ja keiner mehr drauf zu.

Das Problem wird hier sein, dass ich keine echte Datenbank habe, wo ich jedes Mal einen Query absetze. Ich habe somit immer die volle DB, auf die ein Thread zugreift. Mehr ganz am Ende

Darf man fragen wie lange so eine einzelne Berechnung ist ? Also ein Thread ?

Wie lange eine Berechnung dauert, ist nur sehr schwer zu sagen. Also unter Laborbedingungen sind es momentan alles Werte zwischen 0.1 und 1s. Es laufen derzeit 64 Threads parallel auf 8 CPU Cores verteilt.
 

Neue Beiträge

Zurück