首页 新闻 会员 周边 捐助

大数据处理,多线程问题,只有5分了

0
悬赏园豆:5 [已解决问题] 解决于 2010-12-02 09:15

小弟现在有80多w条数据要处理
按照现在的代码来执行的话大概一分钟处理170条,要是都处理完毕的话,每次大概需要80多个小时,时间太长了

我没有太多的多线程的开发经验,不知道如果多线程处理的话能否好一些呢
求教一些多线程处理的代码,谢谢各位啦,解决马上给分
现在的代码大概是这样

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
if (_Table != null && _Table.Rows.Count > 0)
{
int count = _Table.Rows.Count;//这个数据大概是80w
this.progressBar1.Maximum = count;
this._List = new List<PageLogEntity>();

for (int i = 0; i < count; i++)
{
//分析ip
string strClientIP = _Table.Rows[i]["ClientIP"].ToString();
//代码...
foreach (Url url in this._Urls)
{
if (url.IsMatch(visitPageURL))
{

//分析url
代码...
//然后加入list
this._List.Add(pageLogEntity);
break;
}
}
this.label2.Text = string.Format("已完成{0}条记录分析,总共{1}条记录", i, count);
backgroundWorker1.ReportProgress(i);
}
}
}

 

WEBBER的主页 WEBBER | 初学一级 | 园豆:2
提问于:2010-12-01 15:15
< >
分享
最佳答案
0

按照1分钟170条计算,for循环一次需要 350 毫秒。

仔细观察你的代码,我觉得80%的时间是不是在嵌套的 foreach 循环内?

this._Urls 含有多少项?

this._List  应该直接初始化成 _Table.Rows.Count 的大小,避免在循环中拷贝复制数组,因为你是80万条。

是否越到后面速度越慢?考虑内存占用过大,List<T>性能下降。

PageLogEntity[] pages =new PageLogEntity[_Table.Rows.Count]();替代。

这样做之前,请先估算 pages的大小。

 

你的这段代码是否不是单独的?是否考虑从第一台机器接收,在本机处理,然后送往另一台机器?

是否考虑插入数据库,使用存储过程执行?

收获园豆:2
Launcher | 高人七级 |园豆:45050 | 2010-12-01 20:06
其他回答(3)
0

 没看你代码,不过用多线程不一定会比现在效果好。举个例子,你单只手做事的效率不一定比你双手做事的效率底,因为特定情况下,你的思维没那么快。

收获园豆:1
Ou lei | 园豆:619 (小虾三级) | 2010-12-01 16:01
0

可以这样多线程:线程1,处理1-26W的数据;线程2,处理26W-52W的;线程3,处理52-结尾。

 

楼上说的,不完全认同,现在的机器一般是多核的,其效果就不一样了。单线程就只会用到一个核去处理。

收获园豆:1
小彬 | 园豆:947 (小虾三级) | 2010-12-01 16:15
0

建议还是先优化处理代码部份吧,太慢。

收获园豆:1
wujiang | 园豆:206 (菜鸟二级) | 2010-12-01 16:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册