Frage

Ich will die Gemeinschaft der Perspektive auf diese bekommen. Wenn ich einen Prozess, der stark ist DB / IO gebunden ist, wie klug wäre es einzelne Prozesspfade mit Hilfe der Task Parallel Library parallelisieren sein?

Ich werde ein Beispiel verwenden ... wenn ich ein paar Einzelteile haben, und ich brauche die folgenden Operationen tun

  1. Abfrage eine DB für eine Liste der Elemente
  2. Haben einige Aggregationsoperationen Gruppe bestimmte Elemente auf der Grundlage einer dynamischen Liste der Parameter.
  3. Für jedes gruppierte Ergebnis Abfrage der Datenbank für etwas auf der Basis des aggregierten Ergebnis.
  4. Für jedes gruppierte Ergebnis, einige numerische Berechnungen (3 und 4 würde passieren, sequentiell).
  5. Sie einige Einfügungen und Aktualisierungen für das Ergebnis berechnet in # 3
  6. Haben einige Einfügungen und Aktualisierungen für jedes Element in # 1
  7. zurück

Logisch gesehen, kann ich in eine grafische Darstellung von Aufgaben in den Schritten parallelisieren # 3, # 5, # 6 als ein Element keinen Einfluss auf das Ergebnis der vorherigen hat. jede davon wird jedoch auf der Datenbank (SQL Server) warten, die in Ordnung ist, und ich verstehe, dass wir nur so weit, wie der SQL-Server uns lassen verarbeiten kann.

Aber ich will logischerweise die Aufgabe auf dem lokalen Rechner verteilen, so dass es so schnell verarbeitet wie die Datenbank uns ermöglicht, ohne dass irgendetwas an unserem Ende zu warten. Ich habe einige Mock Prototyp getan, wo ich die db Anrufe mit Thread.Sleeps ersetzen (ich habe auch versucht, einige Varianten mit .SpinWait, die eine Million mal schneller war) und die parallele Version ist waaaaay schneller als die aktuelle Implementierung, die vollständig seriell und schon gar nicht parallel sind.

Was ich habe Angst vor zu viel Belastung auf dem SQL-Server setzen ... Gibt es Überlegungen halte ich sollte, bevor ich gehe zu weit auf diesem Weg?

War es hilfreich?

Lösung

Eine andere Möglichkeit wäre, eine Pipeline zu erstellen, so dass der Schritt 3 für die zweite Gruppe in der gleichen Zeit wie Schritt 4 für die erste Gruppe geschieht. Und wenn Sie den Updates in Schritt 5 überlappen können, tut das auch. Auf diese Weise kann gleichzeitige SQL-Zugriffe und Verarbeitung, aber nicht überfordert die Datenbank tun, weil Sie nur zwei gleichzeitige Vorgänge auf einmal los haben.

So haben Sie die Schritte 1 und 2 nacheinander (nehme ich an) eine Sammlung von Gruppen zu erhalten, die weitere Bearbeitung erfordern. Dann. Ihr Hauptthread beginnt:

for each group
  query the database
  place the results of the query into the calc queue

ein zweiter Thread Dienste die Ergebnisse Warteschlange:

while not end of data
  Dequeue result from calc queue
  Do numeric calculations
  place the results of the query into the update queue

Ein dritte Thread Dienste der Aktualisierungswarteschlange:

while not end of data
  Dequeue result from update queue
  Update database

Die System.Collections.Concurrent.BlockingCollection<T> ist eine sehr effektive Warteschlange für diese Art der Sache.

Das Schöne daran ist, dass wenn man es skaliert, wenn Sie möchten, indem Sie mehrere Berechnungs Threads oder Abfrage / Aktualisierung Threads hinzufügen, wenn die SQL Server mehrere gleichzeitige Transaktionen verarbeiten kann.

verwende ich etwas sehr ähnlich wie diese in einem täglichen merge / Update-Programm, mit sehr guten Ergebnissen. Das besondere Verfahren nicht verwendet SQL Server, sondern Standard-Datei-I / O, aber die Konzepte übersetzen sehr gut.

Andere Tipps

Wenn die parallele Version viel schneller als die Serienversion ist, würde ich dir keine Sorgen um die Belastung auf Ihrem SQL-Server ... es sei denn natürlich die Aufgaben Sie sind niedriger Priorität Durchführung im Vergleich zu einigen anderen bedeutenden oder zeitkritische Operationen , die auch auf dem DB-Server ausgeführt wird.

Ihre Beschreibung der Aufgaben ist nicht gut von mir verstanden, aber es klingt fast wie mehrere dieser Aufgaben sollten direkt in der Datenbank durchgeführt wurden (ich nehme an, es sind Details, die das nicht möglich machen?)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top