50W条记下主集数据

 

鉴于专业中需求对多量多少实行飞快校验,试验接受读入内部存储器List实体采取lamdba查找来兑现。

实际上必要:实际读入内部存款和储蓄器数据
50W条记下主集数据,还包涵约二十个子集,子集最大记录数300W条记下。读入内部存储器,校验出结果5分钟以内完成。

测量试验数据读入内部存款和储蓄器后占用约2-3G内部存款和储蓄器。这里测量检验了多线程读取数据,但提速效果并不明了。SQLServer有本人的SQL推行排队机制(读入数据经过遭遇叁个小片尾曲,读入速度慢,占用内部存款和储蓄器大,无意中开采是把记录照片流也读入了内部存储器。实际管理数量经过并无需照片音讯。去掉后速度进步超级大,占用内部存款和储蓄器也紧缩超级多,以往遇到相通操作应超前消释这类景况了卡塔 尔(阿拉伯语:قطر‎

数量校验脚本由另贰个同事写的,大致有500个校验,实体字段合法性校验,及主集子集关联合检查证。从前得到脚本丢进去测量检验,结果半小时也没反应。果决甘休进程。然后就是惨恻的优化进程,曾经疑忌那样的章程行不通。差不离用了两周时间,到达5000个主集消息10秒之内实现。50W数据也在3-5分钟成功。最后成功98个冒出测验。校验结果不荒谬重临。一切OK现已平常上线使用。

 

以下是在此番数据校验完成进程中总括出来应小心的有些地点。


1、由原先数据库校验改为内存校验,内部存款和储蓄器速度越来越快,数据库校验还大概会带动并发等待,死锁等难点。

2、加载数据足以利用十六线程加载

3、主键使用整形加快查询速度 那一点特地重大,速度升高上千倍。

4、选用lamdba表达式查找数据 用联合查询代替for循环

5、依照数据量的高低采取分别使用线性查找或二分查找提升查询速度

6、共用数码只取一回,在全部校验中全局使用。

现身测验 时发觉 静态类中的静态属性不是安闲自得的 因为静态类在内存中唯有豆蔻年华份
去掉static 后多线程测验平常

 

以下为测量试验数据,及连锁认证,能够一贯忽视。感兴趣的的能够看看。


1、7万条记下

A01.FindAll(x => !x.PersonStatus.In(“01”, “02”, “03”, “04”))

巡回查找,共加载152玖拾柒位,耗时:0.0壹玖伍伍9秒.

A01.FindAll(x => !(x.PersonStatus == “01” || x.PersonStatus == “02”
|| x.PersonStatus == “03” || x.PersonStatus == “04”))

循环查找,共加载152九十九个人,耗费时间:0.0284169秒.

 

2、3.3万条记录 x.CodeID == “ZB01″的有3300条记下

Codes.FindAll(x => x.CodeID == “ZB01” && (x.CodeItemName == “市辖区”
|| x.CodeItemName == “县”))

循环查找,共加载2捌十九位,耗费时间:0.0139286秒.

Codes.FindAll(x => x.CodeID == “ZB01” && (x.CodeItemName.In(“市辖区”,
“县”)))

巡回查找,共加载2捌拾六人,耗费时间:0.0230568秒.

 

3、4000条记录 codeIds有3300条记录

personTableList.A01.FindAll(x => !x.A0114.In(codeIds));

A01 4000条记录 循环查找,共加载0人,耗费时间:0.1066983秒.

A01 7万条记录 循环查找,共加载0人,耗费时间:1.7386399秒.

foreach (var A01 in personTableList.A01)

            {

                if (!codes.Exists(x => x.CodeItemID == A01.A0114))

                {

                    persons.Add(A01);

                }

            }

 

上边方式代码,多少个列表都以7W条记下时

巡回查找,共加载75601人,耗费时间:55.4800723秒.

循环查找,共加载75601人,耗费时间:107.4412256秒.

 

3、

A01.FindAll(x => x.W0111G == “”)

巡回查找,共加载1八十一人,耗费时间:0.0039961秒.

A01.FindAll(x => x.W0111G.IsSame(“”))

循环查找,共加载1八十二人,耗费时间:0.0307353秒.

 

 

A01.FindAll(x => ids2.IndexOf(x.PersonID))  最快

A01.FindAll(x => x.PersonID.In(personIds)) 第二

A01.FindAll(x => ids2.Contains(x.PersonID))  第二 

A01.FindAll(x => ids2.Exists(p=>p == x.PersonID)) 最慢

 

手拉手查询 速度快

var query = (from A14 in DataList.A14

                         join A01 in DataList.A01

                           on A14.ID equals A01.ID

                         select new { A14.ID, A14.A1407, A01.A0141
}).ToList();

            personIds = query.FindAll(x => x.A0141 > x.A1407)

十二分关键 主键字段 整形字段比字符串快上百倍

 

 

线性查找:Contains,Find,IndexOf都是线性查找。

二分查找:BinarySearch,因为二分查找必需是对有序数组才使得,所以寻找前要调用List的Sort方法。

敲定:假若List项的个数一点都比比较小,用线性查找要略快于二分查找,项的个数越来越多二分算法优势越通晓。可依照实际境况采用契合的寻找方法。

测量试验数据2条

耗时:0.0186627秒.

二分耗费时间:0.0356611秒.

 

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website