2010-07-04 6 views
0

온라인 데이터웨어 하우스에서 .xml 파일 목록을 다운로드하는 C# 응용 프로그램이 있습니다. 이 응용 프로그램은 파일을 로컬 디렉토리에 덤프하며 모든 10k 파일이 다운로드되기 전에 약 1 시간이 걸립니다. 이것은 매일의 과정입니다.C# 멀티 스레딩을 사용하여 파일을 처리하는 방법

나는이 파일들 각각을 가져 와서 포함 된 데이터를 추출하여 변환하고 데이터베이스에로드해야합니다. ETL 프로세스를 시작하기 전에 모든 파일이 다운로드 될 때까지 기다리지 않으려 고하므로 다운로드와 병행하여이 작업을 수행하고 싶습니다. 불행히도 XML 파일에는 많은 양의 데이터가 포함되어 있으므로 한 번에 약 10 개의 파일을 ETL로 처리 할 수 ​​있습니다. 병렬로드 요구 사항을 달성하기위한 좋은 전략은 무엇입니까?

+1

지금까지 어떤 전략을 생각해 냈습니까? 어떤 다른 제약이 있습니까? 어떤 크기의 파일입니까? 얼마나 많은 데이터가 있습니까? 현재 ETL 프로세스는 무엇입니까? – Oded

+0

유일한 제약 조건은 파일이 너무 많이 (각 파일이 DOM에로드됨에 따라) 파일을 simuntaneously로드 할 수 없다는 것입니다. 파일은 각각 ~ 2MB입니다. 10k 파일이 있습니다. ELT 프로세스는 XML을 구문 분석하고 구문 분석 된 데이터를 SQL Server 데이터베이스에 기록하는 .exe로 구성됩니다. – Guazz

+0

속임수는 아니지만 자연스럽게 관련이 있습니다. http://stackoverflow.com/questions/3135237/ –

답변

0

thread pools으로 상황을 최적화 할 수 있습니다.

먼저 동기화로 보호되는 대기열에 다운로드 할 파일을 모두 추가하십시오.

파일 다운로드를위한 스레드 풀이 있어야합니다. 파일을 다운로드하려고하면 다운로드 할 파일 목록에서 파일 풀을 제거합니다. 파일을 성공적으로 다운로드 한 후에는 처리 할 다른 작업 대기열에 파일을 추가하십시오. 어떤 종류의 오류가 있으면 다운로드 할 파일 대기열에 다시 추가 할 수 있습니다. 큐에 더 이상 다운로드 할 파일이 없으면 각 스레드가 종료됩니다.

실행 중에 실제 XML 파일을 처리하기위한 다른 스레드 풀이 생기면 작업자 스레드 풀은 이미 다운로드 한 XML 파일의 큐에서 가져옵니다. 처리 할 다운로드 된 XML 파일이 더 이상없고 다른 스레드 풀이 이미 완료된 경우 각 스레드가 종료됩니다.

당신이 대기열에 동기화 고려 알아서해야합니다 (예 : 삽입, 제거를위한 뮤텍스로 보호, ...) 스레드 풀을 사용하여

에는 영향을주지 않고 사용하는 방법을 많은 스레드 설정할 수 있습니다 프로그램 논리. 너무 많은 스레드 풀과 같은 고려해야 할 리소스가 얼마나 많은지에 따라 최상의 가치를 결정할 수는 없으며 CPU를 태스크 전환에 너무 많이 집중시킵니다.

0

사용자의 요구에 맞게 너무 복잡하면 Parallel.ForEach/Parallel.For를 참조하십시오. 또한 새 Task 클래스 (TaskFactory.StartNew (...))와 연속성 (예 : 다운로드가 완료된 후 처리 함수로 이동).

관련 문제