Pergunta

Eu tenho um milhão de linhas em uma tabela de banco de dados. Para cada linha que eu tenho que executar um exe costume, analisar a saída e atualizar outra tabela de banco de dados

Como posso executar processos de várias linhas em paralelo?

Agora tenho uma tarefa simples de fluxo de dados -> GetData-> Run Script (Processo Run, Parse Output) -> Data Store Para 6000 linhas demorou 3 hours.Way demais.

Foi útil?

Solução

Não é o único gargalo aqui, correndo o processo por cada linha. Aumentando "EngineThreads" que não ajuda em nada, uma vez que haverá apenas uma thread executar este script em particular transformar qualquer maneira. O tempo gasto em outras transformações provavelmente não importa em tudo. Processos são objetos de peso pesado, e correndo milhares deles nunca vai ser barato.

Não consigo pensar em seguir idéias para torná-lo melhor:

1) A melhor maneira de corrigi-lo é converter o EXE costume em uma montagem e chamá-lo a partir do script transformar -. Para evitar a sobrecarga da criação de processos, analisando a saída etc

2) Se você tem que usar os processos separados, você pode tentar executar esses processos em paralelo. Ele irá ajudar se o processo espera principalmente para alguma entrada / saída (isto é, é de E / S ligado). Se os processos são memória ligada ou vinculada à CPU, você não iria ganhar muito, executando-os em paralelo.

2A) roteiro Complex, pacote simples.

Para executá-los em paralelo, modificar o método ProcessInput em seu script para iniciar o processo de forma assíncrona, e não esperar para a conclusão do processo - move para a próxima linha e criar o próximo processo. Inscrever-se para saída do processo e processo de Exited evento, para que você saiba quando ele tiver terminado. Limitar o número de processos executados em paralelo - caso contrário você vai ficar sem memória. Espere até que todos os processos são feitos antes de retornar da chamada ProcessInput.

2B) script simples, pacote complexo.

Mantenha o script sequencial atual, mas particionar os dados usando SSIS. Adicionar divisão condicional transformar, e dividir o fluxo de entrada em múltiplos fluxos, com base em alguma expressão de hash - algo que fará com que cada saída para receber aproximadamente a mesma quantidade de dados. O número de streams é igual ao número de instâncias de processo que você deseja executar em paralelo. Adicione o script de transformação para cada saída de divisão condicional. Agora você também deve aumentar "Motor Threads" propriedade :) e essas transformações será executado em paralelo. (Nota: com base em tag, eu suponho que você usar SSIS 2008. Você precisará inserir União Todos os transforma adicionais para fazê-lo funcionar no SSIS 2005)

.

Esta deve torná-lo um melhor desempenho, mas milhões de processos é muito. Você dificilmente vai ficar realmente bom desempenho aqui.

Outras dicas

Se você está executando esse processo usando o "fluxo de dados" container, então não é uma propriedade sobre ela chamado "EngineThreads" cujo padrão para um valor de 5. Você pode configurá-lo para um número maior, como 20, que vai dedicar mais threads para processar essas linhas.

Isso é apenas um ajuste de desempenho ou optmisation, se o seu pacote ssis ainda está em execução muito lenta, então eu iria talvez abordar a arquitetura e design do seu pacote.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top