Pregunta

Tengo un millón de filas en una tabla de base de datos. Para cada fila tengo que ejecutar un archivo ejecutable personalizado, analizar la salida y actualizar otra tabla de base de datos

¿Cómo puedo ejecutar el proceso de varias filas en paralelo?

Ahora tengo una tarea de flujo de datos simple: > GetData- > Ejecutar script (Ejecutar proceso, Analizar salida) - > Almacenar datos Para 6000 filas tomó 3 horas. Mucho.

¿Fue útil?

Solución

Existe un solo cuello de botella aquí, que ejecuta el proceso por cada fila. Aumentar " EngineThreads " no ayudaría en absoluto, ya que de todos modos solo habrá un hilo que ejecute esta transformación de script en particular. El tiempo empleado en otras transformaciones probablemente no importa en absoluto. Los procesos son objetos pesados, y ejecutar miles de ellos nunca será barato.

Puedo pensar en las siguientes ideas para mejorarlo:

1) La mejor manera de solucionarlo es convertir su EXE personalizado en un ensamblado y llamarlo desde la transformación del script, para evitar la sobrecarga de crear procesos, analizar el resultado, etc.

2) Si tiene que usar los procesos por separado, puede intentar ejecutar estos procesos en paralelo. Ayudará si el proceso espera principalmente alguna entrada / salida (es decir, está vinculado a E / S). Si los procesos están vinculados a la memoria o a la CPU, no ganaría mucho ejecutándolos en paralelo.

2A) Script complejo, paquete simple.

Para ejecutarlos en paralelo, modifique el método ProcessInput en su script para iniciar el proceso de forma asíncrona, y no espere a que finalice el proceso; vaya a la siguiente fila y cree el siguiente proceso. Suscríbase para procesar la salida y procesar el evento Exited, para que sepa cuándo ha terminado. Limite la cantidad de procesos que se ejecutan en paralelo; de lo contrario, se quedará sin memoria. Espere hasta que todos los procesos hayan terminado antes de regresar de la llamada ProcessInput.

2B) Script simple, paquete complejo.

Mantenga la secuencia de comandos secuencial actual, pero particione los datos mediante SSIS. Agregue la transformación dividida condicional y divida la secuencia de entrada en múltiples secuencias, en función de alguna expresión hash, algo que hará que cada salida reciba aproximadamente la misma cantidad de datos. El número de secuencias es igual al número de instancias de proceso que desea ejecutar en paralelo. Agregue la transformación de su script a cada salida de división condicional. Ahora también debes aumentar " Hilos de motor " propiedad :) y estas transformaciones se ejecutarán en paralelo. (Nota: según la etiqueta, supongo que utiliza SSIS 2008. Deberá insertar transformaciones adicionales de Unión Todas para que funcione en SSIS 2005).

Esto debería hacer que funcione mejor, pero millones de procesos son muchos. Difícilmente obtendrás un buen rendimiento aquí.

Otros consejos

Si está ejecutando este proceso utilizando el " flujo de datos " contenedor, entonces hay una propiedad llamada '' EngineThreads '' que tiene un valor predeterminado de 5. Puede establecerlo en un número mayor como 20, lo que dedicará más hilos a procesar esas filas.

Eso es solo un ajuste de rendimiento o una optimización, si su paquete ssis se sigue ejecutando muy lentamente, entonces tal vez trataría la arquitectura y el diseño de su paquete.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top