并行 - 保存在数据库中

时间:2012-08-15 21:11:29

标签: c# wpf performance parallel-processing

我要将大量数据导入我的数据库。

这些数据需要治疗,过滤,关节等。所以一切都是用对象完成的,在开始之前携带所有表,并将所有对象保存到最后。

完成所有处理后,我运行命令保存。这花了太长时间。我想过练习一种不同的方法:

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用于保存,非常简单,没有任何优化。

2 个答案:

答案 0 :(得分:3)

除非您可以一次对表格进行多次插入,否则多线程应用程序将无济于事。我遇到了SQL Server的这个问题。插入/更新需要很长时间,因为我们做了很多这样的操作并且它们都必须是原子的,因此一次插入/更新意味着整个表被锁定。我不知道mySQL是否能更好地处理表级锁定,但我对此表示怀疑。

您最好的选择可能是查看以数据库为中心的解决方案。执行事务,批量插入,ETL等可能是编写一些C#代码的更好的解决方案。

答案 1 :(得分:2)

好像你过度复杂了。不会

Parallel.ForEach(allCsv, Save);

更直接吗?

当然,通过并行化操作获得任何性能优势是值得商榷的。