C# linq to dataTable大数据量占用CPU问题

yishuihan_2012 2013-02-06 02:50:21
问题的产生:
多线程(20线程以上)下大量的读取数据,并和数据库中的现有数据进行比较,然后将没有的数据添加到数据库中。

之前的做法 是直接读取数据库中的数据,结果导致sqlserver占用CPU 60%+ 内存占用1.6G左右。
现在添上了 数据库连接池和数据缓冲池,现在的结果是 sqlserver占用率下来了,但是程序的CPU占用率上去了,达到70%左右。
问问大家有没有好的办法解决多线程 大数据量比较并更新到数据库的方法呀?
现在的方法:
数据缓冲池中 提供的 判断当前数据中是否包含此数据
 public static bool IsCardExist(string code, string sourcehref, out int id,out int followNum)
{
bool b = false;
followNum = 0;
id = -1;
var query = from card in dtCards.AsEnumerable()
where card.Field<string>("CodeNum").Equals(code) && card.Field<string>("sourceHref").Equals(sourcehref)
select card;
DataRow dr = query.SingleOrDefault<DataRow>();
if (dr!=null)
{
b = true;
id = int.Parse(dr["id"].ToString());
followNum = int.Parse(dr["followCount"].ToString());
}
return b;
}
public static bool IsFollowCardExist(int cardindex, string Fauthor, DateTime Fpublistime)
{
bool b = false;
var query = from fc in dtFollowCards.AsEnumerable()
where fc.Field<int>("Cardid") == cardindex && fc.Field<string>("Fauthor").Equals(Fauthor) && fc.Field<DateTime>("fpublishtime").CompareTo(Fpublistime)==0
select fc;
DataRow dr = query.SingleOrDefault<DataRow>();
if (dr!=null)
{
b = true;
}
return b;
}


其中 dtCards 有30W条以上的数据,dtFollowCards有80W左右的数据,这个数据暂时不会增长。
恳求大家给点意见...
...全文
232 8 点赞 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
yishuihan_2012 2013-02-06
引用 7 楼 gxingmin 的回复:
线程中等待时间间隔长点 建议用索引,不要用存储过程,不要用linq 如果CodeNum不多,可以考虑用Dictionary,CodeNum作为key,这样定位起来更快,检索范围更小
并发线程,也就是好多个线程都在调用我在一楼写的那个,如果直接用数据库,数据库撑不住... 因为他每秒都要读好多次数据库 比如说:每个线程(总共20+线程同时运行的) 1、查询数据是否存在及是否需要更新。 2、不存在则获取具体的数据进行更新 3、dtFollowCards和dtCards是多对一的关系,dtFollowCards中有dtCards的主键id,对于dtFollowCards每一条数据是否需要更新都需要进行比较
  • 打赏
  • 举报
回复
gxingmin 2013-02-06
线程中等待时间间隔长点 建议用索引,不要用存储过程,不要用linq 如果CodeNum不多,可以考虑用Dictionary,CodeNum作为key,这样定位起来更快,检索范围更小
  • 打赏
  • 举报
回复
yishuihan_2012 2013-02-06
引用 5 楼 bdmh 的回复:
你现在这个是用在多线程里面吗,即使是多线程,占用cpu也很正常,几个线程在后台计算,跑满几个cpu也是正常的
是多线程,光 更新线程就20个以上,还有日志保存,存储数据库,显示更新进度 等等..,总共下来如果开20个更新线程 总线程会达到36左右。 问题是这个软件在服务器上,占用CPU太多会导致别的程序卡了...还有网站也受不了... 有没有什么方法 减少CPU的使用 或者优化现在的linq to table的?
  • 打赏
  • 举报
回复
bdmh 2013-02-06
你现在这个是用在多线程里面吗,即使是多线程,占用cpu也很正常,几个线程在后台计算,跑满几个cpu也是正常的
  • 打赏
  • 举报
回复
yishuihan_2012 2013-02-06
引用 2 楼 suhe0919 的回复:
1 用存储过程 楼一的方法
存储过程我之前就用过了。 我觉得这个的问题,是频繁的访问数据库,频繁查询数据是否存在 比如说dtCards中有30W数据,那在判断是否添加的时候理论上 至少要比较30W次,而且是多线程下,也就是说同一时刻 可能有好多个线程在 连接数据库查询数据,所以存储过程也是撑不住的
  • 打赏
  • 举报
回复
yishuihan_2012 2013-02-06
引用 1 楼 gxingmin 的回复:
分别给dtCards的CodeNum和sourceHref字段 dtFollowCards的Cardid和Fauthor、fpublishtime字段 建索引...
dtCards 和dtFollowCards 这两个是内存表,两个静态变量 这样的话 我是不是可以先把这两个表按某一个排序比如说dtCards中的CodeNum排序, 那循环检索的时候能详细说下吗?
  • 打赏
  • 举报
回复
suhe0919 2013-02-06
1 用存储过程 楼一的方法
  • 打赏
  • 举报
回复
gxingmin 2013-02-06
分别给dtCards的CodeNum和sourceHref字段
dtFollowCards的Cardid和Fauthor、fpublishtime字段
建索引
最好在表里按他们排序好,
不要用linq, 自己循环检索,判断比CodeNum大还没检索到后面就不用循环了
同理判断比CardID大后面也不用循环了
  • 打赏
  • 举报
回复
相关推荐
发帖
C#
加入

10.6w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2013-02-06 02:50
社区公告

让您成为最强悍的C#开发者