Frage

Ich habe eine Million Zeilen in einer Datenbanktabelle. Für jede Zeile muss ich eine benutzerdefinierte exe ausführen, analysieren die Ausgabe und eine andere Datenbanktabelle aktualisieren

Wie kann ich Prozess mehrere Reihen parallel laufen?

ich jetzt eine einfache Datenfluß Aufgabe haben -> GetData-> Skript ausführen (Run-Prozess, Parse Output) -> Daten speichern Für 6000 Zeilen dauerte es 3 hours.Way zu viel.

War es hilfreich?

Lösung

Es ist der einzige Engpass hier, um den Prozess für jede Zeile ausgeführt wird. Zunehmende „EngineThreads“ würde nicht helfen, da es nur ein Thread wird diese besondere Skript sowieso läuft verwandeln. Die Zeit in anderen Transformationen verbrachte wahrscheinlich keine Rolle spielt gar nicht. Prozesse sind schwere Gewicht Objekte und Tausende von ihnen laufen wird nie billig sein.

kann ich denke, Ideen zu folgen, um es besser zu machen:

1) Der beste Weg, um es zu beheben ist Ihre benutzerdefinierten EXE in eine Assembly zu konvertieren und aus dem Skript aufrufen verwandeln -. Den Aufwand für die Erstellung von Prozessen zu vermeiden, Parsen der Ausgabe etc

2) Wenn Sie die einzelnen Prozesse verwenden, können Sie versuchen, diese Prozesse parallel laufen zu lassen. Es hilft, wenn der Prozess meist für einige Eingabe / Ausgabe wartet (das heißt, es ist I / O-bound). Wenn die Prozesse Speicher gebunden oder CPU gebunden sind, würden Sie nicht viel gewinnen, indem sie parallel ausgeführt werden.

2A) Komplexe Skript, einfaches Paket.

Um sie parallel zu laufen, die Process Methode in Ihrem Skript ändern, um den Prozess asynchron zu starten, und warten Sie nicht für den Prozess Abschluss - in der nächsten Zeile und erstellen Sie den nächsten Prozess. Abonnieren Ausgabe und Prozess Exited Ereignis zu verarbeiten, so dass Sie wissen, wenn es fertig ist. Beschränken Sie die Anzahl der Prozesse parallel laufen - sonst werden Sie über genügend Arbeitsspeicher ausgeführt. Warten Sie, bis alle Prozesse durchgeführt werden, bevor sie von Process Anruf zurück.

2B) Einfaches Skript, komplexes Paket.

Halten Sie das aktuelle sequenzielle Skript, aber die Daten mit SSIS partitionieren. In bedingte Spaltung verwandeln, und spaltete den Eingangsstrom in mehrere Ströme, basierend auf einigem Hash-Ausdruck - etwas, das jeden Ausgang in etwa die gleiche Menge an Daten empfangen machen. Die Anzahl der Ströme gleich die Anzahl der Prozessinstanzen Sie parallel ausgeführt werden sollen. Fügen Sie Ihr Skript an jeden Ausgang der bedingten Spaltung verwandeln. Jetzt sollten Sie auch „Motor Threads“ Eigenschaft erhöhen :) und diese Transformationen werden parallel ausgeführt werden. (Hinweis: Auf der Grundlage von Tag nehme ich an, verwenden Sie SSIS 2008. Sie werden zusätzliche Union Alle Transformationen einsetzen müssen, um es in SSIS 2005 funktioniert).

Dies sollte es besser durchführen, aber Millionen von Prozessen ist eine Menge. Sie werden hier kaum wirklich gute Leistung.

Andere Tipps

Wenn Sie diesen Vorgang werden die Ausführung der „Datenfluss“ Behälter verwendet wird, dann gibt es eine Eigenschaft auf es „EngineThreads“ aufgerufen, die standardmäßig auf einen Wert von 5. Sie es auf eine höhere Zahl wie 20 einstellen kann, was widmen mehr Threads, um diese Zeilen zu verarbeiten.

Das ist nur eine Leistung zwicken oder optmisation, wenn Ihr SSIS-Paket noch läuft wirklich langsam, dann würde ich vielleicht die Architektur und das Design Ihres Pakets befassen.

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