首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过parallel.for加快速度

通过parallel.for加快速度
EN

Stack Overflow用户
提问于 2015-06-29 15:39:08
回答 1查看 91关注 0票数 0

需要从oracle下载大量数据(每天),然后删除sql服务器上的数据(如果再次运行),然后将数据粘贴到sql server中,并进行sql大容量复制。非平行版本:

代码语言:javascript
复制
     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");
}

我想使用并行的方法来加速这个过程,但是很明显,这些步骤是相互依赖的。这就是我想出来的(我以前从未使用过任务工厂):

代码语言:javascript
复制
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是一个有定义的数据表,我没有逐行写入或读取任何内容。

或者我应该这样写:

代码语言:javascript
复制
 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");
  });
EN

回答 1

Stack Overflow用户

发布于 2015-06-29 15:56:48

问:这是正确使用线程吗?

是的,你正在做两个不同的任务,然后等待它们完成,然后继续工作。绝对+1到@jugarr,指出您不需要完成最后一步工作的另一项任务

问:这就是你所能做的吗?

*也许不是,从你正在做的事情的声音来看,你是

  • 获得单行(从Oracle获得)
  • 在MSSQL中删除单个行(如果它已经存在)
  • 将单行添加回MSSQL

一些建议:

  • 分批处理,不要一次只处理一行。
  • 最慢的部分是什么,它是检索数据、删除数据还是插入数据?可能是这样:
    • 使用单行时,启动新连接的开销可能很大。可能是
    • 试图检索数据时缺少索引
    • 由于引用完整性而试图删除数据时缺少索引

你的吞吐量是多少?多少MB/s?每条曲线是1MB还是1GB?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31119886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档