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

4

2 回答 2

3

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

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

于 2012-08-15T22:18:45.270 回答
2

好像你把它复杂化了。不会

Parallel.ForEach(allCsv, Save);

更直截了当?

当然,您是否会从并行化操作中获得任何性能优势是值得商榷的。

于 2012-08-15T21:35:10.543 回答