小弟现在有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);
}
}
}
按照1分钟170条计算,for循环一次需要 350 毫秒。
仔细观察你的代码,我觉得80%的时间是不是在嵌套的 foreach 循环内?
this._Urls 含有多少项?
this._List 应该直接初始化成 _Table.Rows.Count 的大小,避免在循环中拷贝复制数组,因为你是80万条。
是否越到后面速度越慢?考虑内存占用过大,List<T>性能下降。
用 PageLogEntity[] pages =new PageLogEntity[_Table.Rows.Count]();替代。
这样做之前,请先估算 pages的大小。
你的这段代码是否不是单独的?是否考虑从第一台机器接收,在本机处理,然后送往另一台机器?
是否考虑插入数据库,使用存储过程执行?
没看你代码,不过用多线程不一定会比现在效果好。举个例子,你单只手做事的效率不一定比你双手做事的效率底,因为特定情况下,你的思维没那么快。
可以这样多线程:线程1,处理1-26W的数据;线程2,处理26W-52W的;线程3,处理52-结尾。
楼上说的,不完全认同,现在的机器一般是多核的,其效果就不一样了。单线程就只会用到一个核去处理。
建议还是先优化处理代码部份吧,太慢。