2012-08-15 46 views
0

我有很多數據要導入到我的數據庫。並行 - 保存於數據庫

這些數據需要治療,過濾,關節等等。因此,所有事情都由對象完成,在開始之前攜帶所有表格,並將所有對象保存到最後。

經過全部處理後,我運行命令進行保存。這需要很長時間。我想練習方法也不盡相同:

Task.Factory.StartNew(() => 
     { 
      while (allCSV.Length % 4 != 0) 
      { 
       Save(allCSV.FirstOrDefault()); 
       allCSV = allCSV.Skip(1).ToArray(); 
      } 
  int count1 = 0; 
      int middle = allCSV.Length/4; 
      int count2 = middle; 
      int count3 = middle * 2; 
      int count4 = middle * 3; 
      Parallel.For(0, 4, new Action<int>((i) => 
      { 
       switch (i) 
       { 
        case 0: 
         for (int j = 0; j < middle; j++) 
         { 
         Save(allCSV[count1]); 
         count1++; 
         } 
        break; 
        case 1: 
         for (int k = 0; k < middle; k++) 
         { 
         Save(allCSV[count2]); 
         count2++; 
         } 
        break; 
        case 2: 
         for (int l = 0; l < middle; l++) 
         { 
         Save(allCSV[count3]); 
         count3++; 
         } 
        break; 
        case 3: 
         for (int m = 0; m < middle; m++) 
         { 
         Save(allCSV[count4]); 
         count4++; 
         } 
        break; 
       } 
       } 
      } 

這將是正確的嗎?簡化我的流程最好的方法是什麼?

有些考慮,所用的計算機是最新一代。數據庫是MySQL。

用於保存的ORM非常簡單,沒有任何優化。

回答

3

除非您可以一次對錶進行多次插入,否則多線程應用程序將無濟於事。我遇到了SQL Server的這個問題。插入/更新需要很長時間,因爲我們做了很多這樣的插入/更新,並且它們都必須是原子的,所以一個插入/更新意味着整個表被鎖定。我不知道mySQL是否更好地處理表級鎖定,但我對此表示懷疑。

你最好的選擇可能是看看以數據庫爲中心的解決方案。做交易,批量插入,ETL等可能是編寫一些C#代碼的更好的解決方案。

2

看起來好像你太過於複雜。不會

Parallel.ForEach(allCsv, Save); 

更簡單嗎?

當然,您是否能從並行操作中獲得任何性能優勢值得商榷。

+0

這可能是一個問題。例如,每個對象都有X關係。不是對稱的物體。如果我讓他控制並行。我最終可能會失去太多的表現。 – 2012-08-15 21:45:57

+0

如果需要,Parallel.ForEach將動態添加線程。通常我通過提供一個帶有MaxDegreeOfParallelism的ParallelOptions對象來限制它到environment.processorcount。 – IvoTops 2012-08-16 12:58:06