문제

데이터베이스 테이블에 백만 행이 있습니다. 각 행마다 사용자 정의 exe를 실행하고 출력을 구문 분석하고 다른 데이터베이스 테이블을 업데이트해야합니다.

프로세스 여러 행을 병렬로 실행하려면 어떻게해야합니까?

이제 간단한 데이터 플로우 작업-> getData-> 실행 스크립트 (실행 프로세스, 구문 분석 출력)-> 6000 행에 대한 데이터 저장 3 시간이 걸렸습니다.

도움이 되었습니까?

해결책

여기에는 단일 병목 현상이 있으며 각 행 당 프로세스를 실행합니다. 어쨌든이 특정 스크립트 변환을 실행하는 스레드가 하나만 있으므로 "enginethreads"를 증가시키는 것은 전혀 도움이되지 않습니다. 다른 변화에 소요되는 시간은 아마도 전혀 중요하지 않을 것입니다. 프로세스는 무거운 웨이트 객체이며 수천 개의 실행은 결코 싸지 않을 것입니다.

더 나은 아이디어를 위해 아이디어를 따르는 것을 생각할 수 있습니다.

1)이를 해결하는 가장 좋은 방법은 사용자 정의 EXE를 어셈블리로 변환하고 스크립트 변환에서 호출하는 것입니다. 프로세스 생성, 출력을 구문 분석하는 등의 오버 헤드를 피하십시오.

2) 별도의 프로세스를 사용해야하는 경우 이러한 프로세스를 병렬로 실행하려고 시도 할 수 있습니다. 프로세스가 대부분 입력/출력을 기다리는 경우 도움이됩니다 (예 : I/O 바운드). 프로세스가 메모리 바운드 또는 CPU 바운드 인 경우 병렬로 실행하여 많은 승리를 거두지 못할 것입니다.

2A) 복잡한 스크립트, 간단한 패키지.

병렬로 실행하려면 스크립트에서 프로세스 인페이트 메소드를 수정하여 프로세스를 비동기로 시작하고 프로세스 완료를 기다리지 마십시오. 다음 행으로 이동하여 다음 프로세스를 만듭니다. 프로세스 출력 및 프로세스 종료 이벤트를 구독하므로 언제 완료되었는지 알 수 있습니다. 병렬로 실행되는 프로세스 수를 제한하십시오. 그렇지 않으면 메모리가 부족합니다. ProcessInput 호출에서 돌아 오기 전에 모든 프로세스가 수행 될 때까지 기다리십시오.

2B) 간단한 스크립트, 복잡한 패키지.

현재 순차적 스크립트를 유지하지만 SSIS를 사용하여 데이터를 분할하십시오. 조건부 분할 변환을 추가하고 입력 스트림을 일부 해시 표현식에 따라 여러 스트림으로 분할합니다. 스트림 수는 병렬로 실행하려는 프로세스 인스턴스 수와 같습니다. 조건부 분할의 각 출력에 스크립트 변환을 추가하십시오. 이제 "엔진 스레드"속성을 늘려야합니다. :) 이러한 변환은 병렬로 실행됩니다. (참고 : 태그를 기준으로 SSIS 2008을 사용한다고 가정합니다. 추가 유니언트 모든 변환을 삽입하여 SSIS 2005에서 작동하도록해야합니다).

이로 인해 성능이 향상되지만 수백만 개의 프로세스가 많이 있습니다. 여기서는 정말 좋은 성능을 얻을 수 없습니다.

다른 팁

"데이터 흐름"컨테이너를 사용 하여이 프로세스를 실행하는 경우, 기본값은 기본값 5로 기본값으로 20과 같은 더 높은 숫자로 설정할 수있는 "Enginethreads"라는 속성이 있습니다. 그 행을 처리합니다.

SSIS 패키지가 실제로 천천히 실행 중이면 패키지의 아키텍처와 디자인을 다룰 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top