Domanda

Ho un milione di righe in una tabella di database. Per ogni riga devo eseguire un exe personalizzato, analizzare l'output e aggiornare un'altra tabella di database

Come posso eseguire l'elaborazione di più righe in parallelo?

Ora ho una semplice attività per il flusso di dati - > GetData- > Run Script (Run Process, Parse Output) - > Store Data Per 6000 file ci sono volute 3 ore. Troppo.

È stato utile?

Soluzione

Qui c'è il singolo collo di bottiglia, che esegue il processo per ogni riga. Aumento " EngineThreads " non aiuterebbe affatto, poiché ci sarà comunque solo un thread che esegue questo particolare script per trasformare. Il tempo impiegato in altre trasformazioni probabilmente non ha alcuna importanza. I processi sono oggetti pesanti e eseguirne migliaia non sarà mai economico.

Posso pensare alle seguenti idee per renderlo migliore:

1) Il modo migliore per risolverlo è convertire il tuo EXE personalizzato in un assembly e chiamarlo dalla trasformazione dello script - per evitare il sovraccarico di creare processi, analizzare l'output ecc.

2) Se devi usare processi separati, puoi provare a eseguire questi processi in parallelo. Aiuterà se il processo principalmente attende un certo input / output (cioè è associato a I / O). Se i processi sono associati alla memoria o alla CPU, non vinceresti molto eseguendoli in parallelo.

2A) Script complesso, pacchetto semplice.

Per eseguirli in parallelo, modificare il metodo ProcessInput nello script per avviare il processo in modo asincrono e non attendere il completamento del processo: passare alla riga successiva e creare il processo successivo. Iscriviti per elaborare l'output ed elaborare l'evento Exited, in modo da sapere quando è terminato. Limitare il numero di processi eseguiti in parallelo, altrimenti si esaurirà la memoria. Attendere il completamento di tutti i processi prima di tornare dalla chiamata ProcessInput.

2B) Script semplice, pacchetto complesso.

Mantieni lo script sequenziale corrente, ma partiziona i dati usando SSIS. Aggiungi la trasformazione suddivisa condizionale e dividi il flusso di input in più flussi, sulla base di un'espressione hash, qualcosa che farà sì che ogni output riceva approssimativamente la stessa quantità di dati. Il numero di flussi è uguale al numero di istanze di processo che si desidera eseguire in parallelo. Aggiungi la tua trasformazione dello script a ogni output della suddivisione condizionale. Ora dovresti anche aumentare " Discussioni motore " proprietà :) e queste trasformazioni verranno eseguite in parallelo. (Nota: basato sul tag, suppongo che usi SSIS 2008. Dovrai inserire ulteriori trasformazioni Union All per farlo funzionare in SSIS 2005).

Questo dovrebbe renderlo più performante, ma milioni di processi sono molti. Qui difficilmente otterrai prestazioni davvero eccezionali.

Altri suggerimenti

Se stai eseguendo questo processo utilizzando il " flusso di dati " contenitore, quindi è presente una proprietà chiamata " EngineThreads " il valore predefinito è 5. Puoi impostarlo su un numero più alto come 20, che dedicherà più thread all'elaborazione di quelle righe.

Questo è solo un ottimizzazione delle prestazioni o un'ottimizzazione, se il tuo pacchetto ssis è ancora in esecuzione molto lentamente, forse indirizzerei l'architettura e il design del tuo pacchetto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top