2010-04-07 2 views
3

들어오는 CSV 파일을 가져 와서 데이터베이스 테이블로 덤프하는 BizTalk 프로젝트가 있습니다. 가져 오기는 정상적으로 작동하지만 백만 개 이상의 행이있는 파일에서 약 200-300 개의 레코드 만 유지하면됩니다. 내 오케스트레이션은 이러한 행을 삭제하지만 가져 오는 플랫 파일은 여전히 ​​250MB이며 일반 플랫 파일 파이프 라인을 사용하여 XML로 변환하면 처리하는 데 몇 시간이 걸리고 때때로 서버의 메모리가 부족해질 수 있습니다.BizTalk 2006의 매우 큰 CSV 파일에서 적은 수의 레코드 가져 오기

사용자 지정 파이프 라인 자체에서 걱정하지 않는 행을 삭제하도록 할 수있는 방법이 있습니까? 각 CSV 행의 첫 번째 항목은 몇 개의 문자열 중 하나이며 특정 문자열로 시작하는 행만 유지하려고합니다.

도움을 주셔서 감사합니다.

답변

4

사용자 지정 파이프 라인 구성 요소가 확실히 최상의 솔루션입니다. 디스어셈블러 구성 요소보다 먼저 디코드 단계에서 실행해야합니다.

스트리밍을 사용하도록 설정하는 것은 복잡 할 수 있지만 (확실히 할 수는 있지만) 결과로 트리밍 된 CVS 파일의 크기에 따라 사용자 정의 구성 요소가 실행되는 즉시 전체 입력 파일을 사전 처리 할 수 ​​있습니다. 결과가 작은 경우 메모리 (MemoryStream)에 결과를 생성하거나 파일에 기록한 다음 그 결과의 FileStream을 BizTalk에 반환하여 처리를 계속 진행하십시오.

+0

아직 CSV 일 때 전체 파일을 처리해도 괜찮습니다. XML로 변환 한 것 (그리고 내 오케스트레이션에 전달 된 XMLDocument 객체의 후속 구문 분석)이 문제를 일으키는 것 같습니다. 파이프 라인이 원하는 행만 포함하도록 트림 할 수 있다면 결과 XML 문서는 250MB-ish 대신 1MB 미만이됩니다. – SqlRyan

+2

그러면 메모리에서 가능합니다. 정말 어렵지 않을 것이다. 구성 요소의 내용은 본문 스트림의 맨 위에 StreamReader를 만들고, 한 줄씩 읽고, 일치하지 않는 줄을 버리고, 두 번째 줄로 작성한 내용을 작성한 다음 해당 줄을 줄 아래로 전달하면됩니다. – tomasr

관련 문제