2009-07-10 2 views
2

C#을 사용하여 각 파일을 별도의 파일에 저장하여 DB에서 1,000,000 개의 파일을 생성하려고합니다. 최소 시간 내에이 파일을 생성하는 가장 좋은 방법은 무엇입니까? 여기 데이터베이스에서 1,000,000 개의 파일을 생성하는 최상의 코드

스레딩없이 내 코드입니다 :

AppDomain.CurrentDomain.ProcessExit += new EventHandler(CurrentDomain_ProcessExit); // to calculate the execution time in case of using threading 
    SqlCommand cmd = new SqlCommand(@"select top 1000000 p1+','+p2+','+p3+','+p4 as line from lines ", con); 

    con.Open(); 
    var rdr = cmd.ExecuteReader(); 
    int i = 0; 
    while (rdr.Read()) 
    { 

     string line = rdr.Getring(0); 
     string filename = String.Format("file{0}.txt", ++i); 
     File.WriteAllText(filename, line); 

    } 
    rdr.Close(); 
    con.Close(); 
+0

C# 3.0을 사용하고 있습니까? – abhilash

+0

그는 코드에 var 키워드가 있어야합니다. – Kredns

+0

정말 모두 하나의 디렉토리에 담기를 원하십니까? –

답변

3

당신의 작업은 IO 바운드가 아닌 CPU 바인딩, 가장 좋은 방법은이 개 쓰레드, DB에서 레코드를 읽는 일이 있고에 넣어하는 것입니다 때문에 큐에서 다른 하나는 큐에서 읽고 파일을 생성합니다.

또는, 당신은 당신이 더 많은 스레드를 끝낼 수있다 writeData는이

static void writeData(Object line) 
{ 
      string filename = String.Format("file{0}.txt", ++i); 
      File.WriteAllText(filename, line); 
} 

ThreadPool이 사용의 단점과 같을 것이다

while (rdr.Read()) 
    { 

     string line = rdr.Getring(0); 
     ThreadPool.QueueUserWorkItem (new WaitCallback(writeData), line); 

    } 

과 같은 CLR 스레드 그것을위한 수영장, 뭔가를 사용할 수 있습니다 스레드가 IO에서 대부분 차단되므로 스레드 풀이 요청을 처리 할 새 스레드를 생성합니다.

먼저 스레드 풀을 시도해보고 성능을 측정하고 만족스럽지 않으면 2 스레드, 1 대기열 접근 방식을 시도해 볼 수 있습니다. 잘 알려진 생산자/소비자 문제.

+0

스레드 풀을 사용하면 2713 개의 파일 만 생성되고 내 응용 프로그램은 종료됩니다. 예기치 않은 동작입니다. – Ammroff

0

더 많은 스레드가 있으면 도움이됩니다. 정확한 숫자를 파악하는 가장 좋은 방법은 경험적으로 있지만, CPU 중심 작업과 같은 방식으로 CPU 코어 당 하나씩 제한하지 마십시오. 가장 쉬운 방법은 ThreadPool을 사용하는 것이지만 생산자/고객 대기열 시스템은보다 유연하고 조정 가능할 것입니다.

0

왜 SSIS 패키지를 사용하지 않습니까? 이런 종류의 일을하기로되어 있지 않습니까?

+0

파일을 생성하는 SSIS 패키지에 대한 기사가 있습니까? – Ammroff

0

This 도움이 될 수 있습니다.

+0

데이터베이스가 SQL Server 인 경우이 작업이 유용합니다. 대부분의 사람들이 사용하기를 바랍니다 :) – mfawzymkh

+1

그는 연결 문자열을 표시하지는 않았지만 SQLCommand를 사용하면 SQL을 데이터베이스로 사용하고 있음을 알 수 있습니다. 그러므로 나는 이것이 사용될 수 있다고 생각한다. – danish

+0

예, SQL Server 2008을 사용하고 SSIS를 사용하여 단일 파일에 각 레코드를 생성하는 방법을 찾을 수 없습니다. 아무도 도와 드릴 수 있습니까? – Ammroff

관련 문제