2011-02-01 2 views
5

에 2 억 개 행을 삽입 I가 내가 속도를 최적화하고자하는 다음 (간체) 코드 : 이미 일을 속도를 시도 SqlBulkCopy의를 사용하고C#을 최적화 : 데이터베이스

long inputLen = 50000000; // 50 million 
DataTable dataTable = new DataTable(); 
DataRow dataRow; 
object[] objectRow; 
while (inputLen--) 
{ 
    objectRow[0] = ... 
    objectRow[1] = ... 
    objectRow[2] = ... 

    // Generate output for this input 
    output = ... 

    for (int i = 0; i < outputLen; i++) // outputLen can range from 1 to 20,000 
    { 
     objectRow[3] = output[i]; 
     dataRow = dataTable.NewRow(); 
     dataRow.ItemArray = objectRow; 
     dataTable.Rows.Add(dataRow); 
    } 
} 

// Bulk copy 
SqlBulkCopy bulkTask = new SqlBulkCopy(connection, SqlBulkCopyOptions.TableLock, null); 
bulkTask.DestinationTableName = "newTable"; 
bulkTask.BatchSize = dataTable.Rows.Count; 
bulkTask.WriteToServer(dataTable); 
bulkTask.Close(); 

,하지만 DataTable 자체에 값을 할당하는 것이 느린 것으로 나타납니다.

DataTable의 작동 방식을 모르므로 먼저 재사용 가능한 배열을 만든 다음 불필요한 오버 헤드를 만든 다음 DataRow에 할당하고 DataTow를 DataTable에 추가하는 방법으로 궁금합니다. 또는 DataTable을 처음부터 최적으로 사용하지 않습니까? 입력은 데이터베이스에서 가져옵니다.

나는 LOC, 단지 속도에 대해 많이 걱정하지 않는다. 누구든지 이것에 대해 조언을 해줄 수 있습니까?

+0

구현 예는 'SimpleDataReader'를 참조하십시오. [여기] (https://groups.google.com/group/microsoft.public.dotnet.languages.csharp/msg/b1d70b504cdee2ad?hl=ko) –

답변

13

같은 큰 테이블의 경우, 대신

public void WriteToServer(IDataReader reader) 

방법을 사용해야합니다.

기존의 IDataReader에서 데이터를 가져올 수 없다면 코드와 함께 "가짜"IDataReader 인터페이스를 직접 구현해야 할 수도 있습니다. 그러나 이렇게하면 "스트리밍" 끝에서 끝까지 2 억 회를 피할 수 있습니다.

+1

나를 이길 것 같아서 :) –

+0

SQLBulkCopy는 데이터베이스를 효율적으로 쓸 수 있습니다 ** ** 행이 구성됨 ? 입력은 동일한 데이터베이스에서오고 있지만 각 행마다 잠재적으로 20000 개의 새 행을 만듭니다. –

+0

Box9 @ 네, 정확히 그 –

0

당신은 메모리에 전체 데이터 테이블을 구성하지 않아야합니다. WrtieToServer의 overload을 사용하면 DataRow의 배열을 사용합니다. 데이터를 덩어리로 분할하면됩니다.

+0

Isn' 그 방법은 여전히 ​​메모리에 그것을 구성하고 있습니까? 게다가, 만약 내가 기억이 부족하지 않다면, 그것을 메모리에서 가장 빨리 구성하지 않는 것입니까? 대신 200m의 한 번에 1K 행을 구성하는 경우 –

+0

는 이와 같은 데이터의 양을 유지하기 위해 메모리 관리자에 대한 훨씬 더 쉽게 될 것입니다. 이 외에도, 당신은 거의 200m의 레코드를 한 번에 메모리에 저장하여 교환 할 것입니다. – gor

4

대신 메모리에 거대한 데이터 테이블을 잡고, 나는이 대량 복사가 간다 데이터를 제공하는 IDataReader을 구현 건의 할 것입니다. 이렇게하면 모든 것을 메모리에 보관할 필요가 줄어들어 성능을 향상시킬 수 있습니다.

관련 문제