2011-07-28 2 views
1

입력 된 열을 추가하여 DataTable을 정의했습니다. DataTable이 100 만 ~ 300 만 행의 범위를 차지할 것으로 기대합니다.DataTable 내용을 채울 때 SQL 테이블에 복사하는 방법

필자는 Microsoft의 TextFieldParser (Peek 메서드를 통해 다양한 고정 너비 형식을 지원하기 때문에)를 사용하여 DataTable의 행을 채 웁니다.

DataTable의 행을 미러링 된 SQL 테이블로 복사하는 작업을하고 싶습니다.

전체 DataTable을 채운 다음 언급 된대로 SqlAdapter 및 SqlCommandBuilder를 사용하여 SQL 테이블을 업데이트하면 here 메모리가 부족합니다.

어떻게하면됩니까?

답변

1

1MB의 행에 대해 DataTable을 사용하지 않는 것이 좋습니다. INSERT에 대해 새 SqlComand를 만들고 모든 테이블 필드를 매개 변수로 만들고 루프에서이 명령을 실행하면됩니다. 하고 얼마나 많은 확인, 지금까지의 당신은 데이터 행을 읽을 때)

1 : 이미 DataTable을 사용하여 코드를 많이 쓴 경우

, 당신은 버퍼로 고려, 다음과 같은 해결 방법이있을 수 있습니다 이미 읽은 적이 있습니다.

2) DataTable.Update()를 실행하면 바로 10K 개의 행을 얻습니다.

당신은)

DataTable.Clear(); 
DataTable.AcceptChanges(); 

4

를 호출하여 당신이 DataTable의 모든 데이터를 정리 한 후) (당신은 BUFFER_SIZE으로이 매개 변수를 호출하고 하드 코딩을 피하기 위해 구성 어딘가에 넣을 수)

(3) 파일에서 데이터 계속 읽기, 루프 반복

또한 파일 구조 및 목적을 알지 못해도 일반적인 제안을하기는 어렵습니다. 매우 큰 데이터 세트를 사용할 때 "메모리 부족"을 피하는 방법에 대한 질문에만 답변했습니다. http://msdn.microsoft.com/en-us/library/ms188365.aspx

- 그러나 나는 또한

1) 대량 삽입

로, 중간 데이터의 저장 및 가능한 모든 SQL 서버가 제공하는 의미로 직접 처리 파일로 .NET 데이터 테이블을 사용하지 않도록 가능한 모든 옵션을 고려하는 것이 좋습니다 2) bcp 유틸리티 - http://msdn.microsoft.com/en-us/library/ms162802.aspx

3) MS SQL Intergartion 서비스 - 그 명령과 도구를 사용하여 http://msdn.microsoft.com/en-us/library/ms141026.aspx

대량 삽입 작업은 .NET에서 시작할 수 있습니다.

+0

추천하지 않는 이유는 무엇입니까? SqlBulkCopy와 페어링하는 것은 어떻습니까? –

+0

대량 복사와 페어링 할 수 있지만 SqlCommand를 사용하기 때문에 메모리가 부족합니다. 메모리의 DataTable 크기가 매우 커서. 대량 복사는 INSERT 작업의 속도를 최적화 할 수 있습니다. 위에서 2에서 제안한 솔루션에서 SqlBulkCopy.WriteToServer를 사용하십시오. –

관련 문제