2009-07-10 35 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 2009-07-10 02:53:39

+0

他不得不在他的代碼中使用var關鍵字。 – Kredns 2009-07-10 02:59:18

+0

你真的希望他們都在一個目錄? – 2009-07-10 03:26:09

回答

3

由於您的操作IO的約束,而不是CPU限制,最好的辦法是有2個線程,一個從數據庫中讀取記錄,並把它變成一個隊列中,另一個從隊列中讀取並生成文件。

或者,你可以使用的CLR線程池,像

while (rdr.Read()) 
    { 

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

    } 

和東西寫數據看起來像

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

使用線程池的缺點是,你可能最終會更多的線程比你想要的要多,因爲你的線程大部分時間都會被IO阻塞,所以線程池將創建新的線程來處理你的請求。您可以先嚐試線程池並測試性能,如果您不滿意,可以嘗試2線程,1隊列方法;如果您不滿意,可以嘗試2線程,1隊列方法;如果您不滿意,可以嘗試2線程,1隊列方法;如果您不滿意,衆所周知的生產者/消費者問題。

0

您將受益於擁有更多線程;找出確切數量的最佳方法是憑經驗確定的,但不要像CPU限制任務那樣將自己限制爲每個CPU內核一個。最簡單的方法是使用ThreadPool,但生產者/消費者排隊系統會更加靈活和可調。

0

爲什麼不使用SSIS包?難道它不應該做這些事嗎?

相關問題