xml地图|网站地图|网站标签 [设为首页] [加入收藏]
性能测试,DataTable一些使用方法
分类:编程

 C#—Nhibernate探索

 

C#DataTable一些使用方法

本篇文章,让我们一起来探索Nhibernate。

由于工作中需要对大量数据进行快速校验,试验采用读入内存List实体采用lamdba查找来实现。

  1,使用DataTable必须要引用System.Data.

首先我们去搜索Nhibernate下载地址,如下链接所示。

实际需求:实际读入内存数据 50W条记录主集数据,还包含约20个子集,子集最大记录数300W条记录。读入内存,校验出结果5分钟之内完成。

  2,定义一个DataTable

该版本可能是最新版,我下载的4.0.4.GA。其中GA意思我没搞清楚。不过应该不重要。

测试数据读入内存后占用约2-3G内存。这里测试了多线程读取数据,但提速效果并不明显。SQLServer有自己的SQL执行排队机制(读入数据过程遇到一个小插曲,读入速度慢,占用内存大,无意中发现是把记录照片流也读入了内存。实际处理数据过程并不需要照片信息。去掉后速度提升很大,占用内存也缩小很多,以后遇到类似操作应提前排除这类情况了)

DataTable dt=new DataTable();

数据校验脚本由另一个同事写的,大约有500个校验,实体字段合法性校验,及主集子集关联检验。开始拿到脚本丢进去测试,结果半个小时也没反应。果断结束进程。然后就是痛苦的优化过程,曾经怀疑这样的方式行不通。差不多用了两周时间,达到5000个主集信息10秒以内完成。50W数据也在3-5分钟完成。最后完成100个并发测试。校验结果正常返回。一切OK现已正常上线使用。

 3,为DataTable创建列

分析文件内容

 

//1.创建空列
DataColumn dc = new DataColumn();
dt.Columns.Add(dc);
//2.创建带列名和类型名的列
dt.Columns.Add("column0", typeof(String));
//3.通过列架构添加列
DataColumn dc = new DataColumn("column1", typeof(String));
dt.Columns.Add(dc);

下载完成后,解压缩,我们看到文件夹内容如下图所示。

以下是在本次数据校验实现过程中总结出来应注意的一些地方。

 4,为DataTable创建行

 图片 1


//1.创建空行
DataRow dr = dt.NewRow();
dt.Rows.Add(dr);
//2.创建空行
dt.Rows.Add();
//3.通过行框架创建并赋值
dt.Rows.Add("小明",18);//Add里面参数的数据顺序要和dt中的列的顺序对应 
//4.通过复制dt2表的某一行来创建
dt.Rows.Add(dt2.Rows[i].ItemArray);

我们可以分析得出,其中Required_Bins存储的是类库和其他资源;字面的意思Required,是必须文件。

1、由原来数据库校验改为内存校验,内存速度更快,数据库校验还会带来并发等待,死锁等问题。

 5,DataTable的取值和赋值

打开Required文件夹,我们看到里面是这样的。

2、加载数据可以采用多线程加载

//新建行的赋值
DataRow dr = dt.NewRow();
dr[0] = "小明";//通过索引赋值
dr["column1"] = DateTime.Now; //通过名称赋值
//对表已有行进行赋值
dt.Rows[0][0] = "小明"; //通过索引赋值
dt.Rows[0]["column1"] = DateTime.Now;//通过名称赋值
//取值
string name=dt.Rows[0][0].ToString();
string time=dt.Rows[0]["column1"].ToString();

图片 2

3、主键使用整形加快查询速度 这一点特别重要,速度提升上千倍。

 6,DataTable的筛选行和删除行

这里有两个类库;可以分析得出,这两个类库是要被引用的。

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

//select用法
//筛选姓名列值中有"小"的行的集合(模糊查询),第二句可添加按年龄降序排序
DataRow[] dr = dt.Select("姓名 like '小%'");
DataRow[] drs = dt.Select("姓名 like '小%'", "年龄 DESC");

类库拥有对应的XML,没找到具体使用该XML的方法。所以暂时不去理他。

5、根据数据量的大小采用分别采取线性查找或二分查找提高查询速度

//Compute用法

NHibernate.pdb应该是没有用的。估计是作者忘记删除了。

6、共用数据只取一次,在整个校验中全局使用。

   Object result = dt.Compute("sum(成绩)", "年龄>16 and 姓名 like '小*'");

nhibernate-configuration.xsd和nhibernate-mapping.xsd两个文件暂时不知道要干什么用的。

并发测试 时发现 静态类中的静态属性不是安全的 因为静态类在内存中只有一份 去掉static 后多线程测试正常

 //result为计算出的结果,compute函数的第一个参数一般为聚合函数,后一个参数为筛选条件

但看到.xsd文件,第一时间反应,他们应该是用来帮助开发者,快速生成配置文件用的。为了保险起见,我们上网查询一下。

 

 

查询结果:

以下为测试数据,及相关说明,可以直接忽略。感兴趣的的可以看看。

//Find用法

查询结果是,他们俩是【文件智能提示功能】用的。


dt.PrimaryKey = new DataColumn[] { dt.Columns["学号"] };

且nhibernate-configuration.xsd和nhibernate-mapping.xsd是要放到c盘的,路径如下:

1、7万条记录

 DataRow dr1 = dt.Rows.Find("004");

C:Program Files (x86)Microsoft Visual Studio 11.0XmlSchemas

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

//Find用法要求datatable有主键,是一种按主键搜寻一行数据的方法

因为是我用的是vs2012,所以,我找的路径是Microsoft Visual Studio 11.0。并将文件放在了那里面。

循环查找,共加载15298人,耗时:0.019519秒.

 

虽然感觉,这俩文件好像不是这么用的,但由于可以判断它们并不影响程序运行,所以,先且不管他们,等程序运行起来后,再删除他们试试。

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

 

 

循环查找,共加载15298人,耗时:0.0284169秒.

 

再之后,我上网调查了下Nhibernate的应用。

 

//删除行

上网调查后,发现Nhibernate有Castle框架、LinFu框架、Spring.Net三种。

2、3.3万条记录 x.CodeID == "ZB01"的有3300条记录

//使用DataTable.Rows.Remove(DataRow)方法

看起来很复杂,文章有很多,写的又很复杂,于是我放弃调查,直接尝试使用,首先第一步,直接引用类库。

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

dt.Rows.Remove(dt.Rows[0]);

本文由澳门新葡亰手机版发布于编程,转载请注明出处:性能测试,DataTable一些使用方法

上一篇:动软代码生成器基础运用 下一篇:获取服务端https证书,sqlserver生成32位数据库字段
猜你喜欢
热门排行
精彩图文