2010-04-14 58 views
10

대용량의 데이터를 CSV (3 백만 + 행)에서 데이터베이스로로드하는 가장 효율적인 방법은 무엇입니까?C# 대용량의 데이터를 CSV에서 데이터베이스로 가져 오기

  • 데이터 (예 : 이름 열은 성과 이름으로 분리 할 등을 필요로) 나는 가능 즉, 시간의 제약으로 효율적으로이 작업을 수행 할 필요가
  • 포맷해야

C# 응용 프로그램을 행 단위로 사용하여 데이터를 읽고 변환하고로드하는 옵션이 있습니다. 이것이 이상적인가, 그렇지 않다면 나의 선택은 무엇인가? 멀티 스레딩을 사용해야합니까?

+0

시간 제한은 얼마나 엄격합니까? – Jake

답변

4

당신은 I/O 경계가 될 것이므로, 멀티 스레딩이 반드시 더 빠르게 실행되는 것은 아닙니다.

지난 번 내가 이것을 한 것은 약 12 ​​라인의 C#이었습니다. 한 스레드에서 플래터에서 데이터를 읽을 수있을만큼 빨리 하드 디스크를 실행했습니다. 소스 파일에서 한 번에 한 줄씩 읽었습니다.

직접 작성하지 않으려면 FileHelpers 라이브러리를 사용해보십시오. Sébastien Lorion's work을보고 싶을 수도 있습니다. 그의 CSV 독자는 성능 문제를 다루기 위해 특별히 작성되었습니다.

+0

예, C# io 라이브러리는 버퍼로 잘 작성되었습니다. 최근에 저는 1 csv에서 다른 것 (1.5 m 라인)으로 변환해야했습니다. –

+1

FileHelpers도 좋습니다. 필자는 쉼표를 사용하여 값을 처리하는 파서를 작성하지 않아도되었습니다. CSV에 불쾌한 세부 사항이있는 경우 FileHelpers를 고려하십시오. –

+0

나는 과거에 드라이브에 대한 탐색 시간이 문제 였음을 안다. 대형 이미지 파일의 경우 한 드라이브에서 읽고 드라이브 헤드 위치를 변경하기 위해 횟수를 줄이기 위해 다른 드라이브에 기록합니다. – yamspog

2

나는 귀하의 솔루션에 동의합니다. 파일을 한 번에 한 줄씩 읽으면 전체 파일을 한 번에 읽는 오버 헤드를 피해야합니다. 그러면 응용 프로그램이 빠르고 효율적으로 실행되어야하며 주로 파일에서 읽는 시간 (상대적으로 빠름)을 취하고 줄을 구문 분석해야합니다 . 주의 할 점은 CSV에 개행 문자를 삽입했는지 조심하는 것입니다. 사용중인 특정 CSV 형식이 실제로 데이터의 따옴표 사이에 줄 바꿈을 출력하는지 여부는 모르지만이 알고리즘을 혼동시킬 수 있습니다.

또 하나의 문자열에 많은 insert 문을 포함하는 삽입 문을 일괄 처리하는 것이 좋습니다. 이후의 외래 키에 사용해야하는 생성 된 키 값을 검색 할 때 문제가없는 경우 데이터베이스로 보냅니다. 생성 된 키 값을 검색 할 필요가 없기를 바랍니다.) SQL Server (사용중인 경우)가 일괄 처리 당 2200 개의 매개 변수만을 처리 할 수 ​​있으므로 일괄 처리 크기를 고려하여 계정을 제한하십시오. 또한 삽입을 수행하기 위해 매개 변수화 된 TSQL 문을 사용하는 것이 좋습니다. 파일에서 읽는 것보다 레코드 삽입에 더 많은 시간이 소비 될 것으로 생각됩니다.

1

사용중인 데이터베이스를 명시하지는 않지만 언급 한 언어가 C# 인 경우 SQL Server를 사용합니다.

BCP를 사용하여 데이터를 가져올 수없는 경우 (중요한 처리가 필요한 경우에는 들리지 않음) SSIS는 다음 가장 빠른 옵션입니다. 세계에서 가장 좋은 개발 플랫폼은 아니지만 매우 빠릅니다. 합리적인 시간 내에 직접 작성할 수있는 응용 프로그램보다 확실히 빠릅니다.

+0

나는 이것에 관해 Greg와 JayRiggs와 함께있다. C#을 건너 뛰십시오 (SQL Server 용 CLR 모듈을 작성하지 않는 한). SQL을 사용하십시오. 당신이 듣지 못했을 때를 대비하여 파일로부터 대량의 데이터로 작업하는 것이 좋습니다. ;) 그것은 conxns 등을 개방 할 때 모든 종류의 두통을 덜어 줄 것입니다. – jcolebrand

+0

이것은 단위 테스트에서 매우 어렵습니다. – guazz

+0

이것은 실제로 단위 테스트가 많이 사용되는 문제가 아닙니다. 사람들은 단위 테스트에 너무 집중하고 더 큰 그림을 무시합니다. 테스트해야 할 것은 CSV에 알려진 데이터 집합이 주어지면서 데이터베이스에 들어오는 데이터가 정확하고 알려진 나쁜 사례가 예상대로 처리 (고정, 폐기 또는 실패)된다는 것입니다. 그런 식으로하면 데이터베이스에 들어가는 방법이 중요하지 않습니다. 실용적인 관점에서 말하자면 SSIS는 다른 무엇보다도 테스트 할 만합니다. –

3

csvreader을 사용하면 CSV를 빨리 읽을 수 있습니다.

SQL Server를 사용한다고 가정하면 CachedCsvReader을 사용하여 데이터를 SqlBulkCopy과 함께 사용하여 SQL Server로로드 할 수있는 DataTable로 읽습니다.

+0

이것은 내가 사용하는 것입니다. 나는 csvreader를 좋아한다. 그것은 구분 된 파일에 접근하는 매우 편리한 방법이다. – galford13x

+0

+1 for the SqlBulkCopy – Kiril

0

BCP는 꽤 빠르므로 데이터를로드하는 데 사용합니다. 문자열 조작의 경우 데이터가 있으면 SQL에 CLR 함수를 사용합니다. 복잡성을 추가하고 성능을 떨어 뜨리는 경우를 제외하면이 시나리오에서는 멀티 스레딩이 도움이되지 않습니다.

0

& DataTable을 채우고 대상 db 테이블을 자른 다음 System.Data.SqlClient.SqlBulkCopy.WriteToServer (DataTable dt)를 사용하십시오.

+0

아쉽게도 기존 레코드를 업데이트해야하며 데이터가 매일로드됩니다. – guazz

관련 문제