问题描述
数据表数据很少不超过100条但不停的在变,分析一条里面的数据耗时不到1秒。我现在不断遍历进行分析while(true){DateTimedate1=DateTime.Now;DataViewdv=db.ExecuteDataView(sql);//数据不超过100条,但不停的在变for(inti=0;i<dv.Table.Rows.Count;i++){xx(dv[i][0]);//分析数据;}doublett=(DateTime.Now-date1).TotalMilliseconds;if(tt>3000){超过3秒发信息警告分析太慢了}}现在老是收到分析超时的信息。怎么弄才能提高效率?有人说用异步或多线程。异步,xx分析函数我放到一个委托里面也会出现超时但比直接遍历好很多。多线程基本没法用,遍历时把xx函数放到线程里不久就会内存泄漏。怎么才能提高效率,在不存在内存泄漏的情况下把CPU打上去,让其分析的更快。。
解决方案
解决方案二:
这点数据,最大可能性是你分析方法有问题,100条数据怎么也不可能超过1秒.具体问题你要贴出来sql脚本内容才好说
解决方案三:
你解决多线程内存泄漏问题就好了嘛看你的代码,内存泄漏是因为while(true)无限制创建新线程,解决思路是控制正在计算的总线程数,只有当一批计算完成后才开始下一批
解决方案四:
可以合并一起请求的就一起合并,然后确认到底那部分耗时最多
解决方案五:
引用1楼shoppo0505的回复:
这点数据,最大可能性是你分析方法有问题,100条数据怎么也不可能超过1秒.具体问题你要贴出来sql脚本内容才好说
100条数据分析时需要调用其他地方的数据,基本无法优化了。我要直接把CPU打上去,但不能有内存泄漏
解决方案六:
分析一条里面的数据耗时不到1秒(0.9秒是不到1秒吧?)那么分析100条数据耗时不到100秒(8、9十秒也是正常的)那么你if(tt>3000){超过3秒发信息警告分析太慢了}显然是太苛刻了提高效率的手段是优化xx中的算法优化后仍不能满足要求,则可使用并行处理for(inti=0;i<dv.Table.Rows.Count;i++)....改成Parallel.ForEach(Partitioner.Create(0,dv.Table.Rows.Count),(W)=>{for(inti=W.Item1;i<W.Item2;i++)....});
解决方案七:
写了个监控线程完成的小程序,贴给你classCountDownLatch{privateobjectlockObj=newObject();privateintcounts;publicCountDownLatch(intcounts){this.counts=counts;}publicvoidAwait(){lock(lockObj){while(counts>0){Monitor.Wait(lockObj);}}}publicvoidCountDown(){lock(lockObj){counts--;Monitor.PulseAll(lockObj);}}}
classTasks{privateCountDownLatchlatch;privateObjectdata;publicTasks(CountDownLatchlatch,Objectdata){this.latch=latch;this.data=data;}publicvoidAnalysis(objecto){//分析dataSystem.Threading.Thread.Sleep(newRandom().Next(3)*1000);this.latch.CountDown();}}
CountDownLatchlatch=newCountDownLatch(100);for(inti=0;i<100;i++){ThreadPool.QueueUserWorkItem(newWaitCallback(newTasks(latch,newobject()).Analysis),latch);}latch.Await();//全部线程执行完成,继续
解决方案八:
数据不多,但是程序很慢,那么问题基本上就存在于你的数据库查询操作太多,数据的分析和计算是很快的,你不能每次都去数据库查询数据,再去计算。思路是尽可能的减少数据库查询操作。如果换种办法的话我建议这样,你采用WPF中数据绑定的思想,DataView绑定一个查询的数据源,实现INotifyPropertyChanged接口,数据源变化时DataView的数据会跟着变化,你直接操作DataView中的数据,这样会比较快。