我要将大量数据导入我的数据库。
这些数据需要治疗,过滤,关节等。所以一切都是用对象完成的,在开始之前携带所有表,并将所有对象保存到最后。
完成所有处理后,我运行命令保存。这花了太长时间。我想过练习一种不同的方法:
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用于保存,非常简单,没有任何优化。
答案 0 :(得分:3)
除非您可以一次对表格进行多次插入,否则多线程应用程序将无济于事。我遇到了SQL Server的这个问题。插入/更新需要很长时间,因为我们做了很多这样的操作并且它们都必须是原子的,因此一次插入/更新意味着整个表被锁定。我不知道mySQL是否能更好地处理表级锁定,但我对此表示怀疑。
您最好的选择可能是查看以数据库为中心的解决方案。执行事务,批量插入,ETL等可能是编写一些C#代码的更好的解决方案。
答案 1 :(得分:2)
好像你过度复杂了。不会
Parallel.ForEach(allCsv, Save);
更直接吗?
当然,通过并行化操作获得任何性能优势是值得商榷的。