需要从oracle下载大量数据(每天),然后删除sql服务器上的数据(如果再次运行),然后将数据粘贴到sql server中,并进行sql大容量复制。非平行版本:
for (int i = 0; i < curves.Rows.Count; i++)
{
//download data from oracle
var data = GetCurve(connectString, impdate, curves.Rows[i]);
//delete old data in sql server
DeleteSQL(DateTime.Now, curves.Rows[i]);
//write to sql server with sqlbulk.copy
writeCurve(data, "dbo.t_Curves");
}我想使用并行的方法来加速这个过程,但是很明显,这些步骤是相互依赖的。这就是我想出来的(我以前从未使用过任务工厂):
Parallel.For(0, curves.Rows.Count, i =>
{
var taskLoad = Task.Factory.StartNew(() => GetCurve(connectString, impdate, curves.Rows[i]));
var taskDelete = Task.Factory.StartNew(() => DeleteSQL(impdate, curves.Rows[i]));
taskDelete.Wait();
taskLoad.Wait();
var taskWrite = Task.Factory.StartNew(() => writeCurve(taskLoad.Result, "dbo.t_Curves"));
});这大约是时间的一半。缩短一半的时间是我所能期望的吗?这是正确使用线程吗?这就是我所能做的吗?我能包括任何进一步的提速吗?
更新
只是为了获取信息,Curves是一个有定义的数据表,我没有逐行写入或读取任何内容。
或者我应该这样写:
Parallel.For(0, curves.Rows.Count, i =>
{
var taskLoad = Task.Factory.StartNew(() => GetCurve(connectString, impdate, curves.Rows[i]));
var taskDelete = Task.Factory.StartNew(() => DeleteSQL(impdate, curves.Rows[i]));
var res1 = await taskDelete;
var res2 = await taskLoad;
writeCurve(res2, "dbo.t_Curves");
});发布于 2015-06-29 15:56:48
问:这是正确使用线程吗?
是的,你正在做两个不同的任务,然后等待它们完成,然后继续工作。绝对+1到@jugarr,指出您不需要完成最后一步工作的另一项任务
问:这就是你所能做的吗?
*也许不是,从你正在做的事情的声音来看,你是
一些建议:
你的吞吐量是多少?多少MB/s?每条曲线是1MB还是1GB?
https://stackoverflow.com/questions/31119886
复制相似问题