Datatable当列非常多时更新数据耗时[解决方案]

Datatable是.net下一个非常好用的数据结构,一般情况下当列的数据量再1000以内的数量级,操作不需要考虑性能。这里为什么提到列,因为Datatable对行的处理非常好,如果列不是很多的时候,插入几万行乃至几十万行数据都是非常快速的。

但是当列过多时,这里就有可能带来非常大的性能问题。现在我们建立了一个10000列的table,并添加了10行的数据,来试验一下不同的插入数据方式会带来怎样的性能影响。

方法1:代码如下,这个一种非常好的方式,总共耗时0.104秒

            //METHOD 1
            int ColCnt = 10000;
            DataTable dt = new DataTable();
            //define table columns
            for(int i=0; i<ColCnt;i++)
            {
                dt.Columns.Add("C" + i.ToString(), typeof(float));
            }
            //add 10 rows data
            for (int j = 0; j < 10; j++)
            {
                DataRow dr = dt.NewRow();
                for (int i = 0; i < ColCnt; i++)
                {
                    dr["C" + i.ToString()] = i * 1.1;
                }
                dt.Rows.Add(dr);
            }

方法2:先添加一个Dummy Row,再循环更新此row的每个cell,耗时72秒

             //METHOD 2
            int ColCnt = 10000;
            DataTable dt = new DataTable();
            //define table columns
            for (int i = 0; i < ColCnt; i++)
            {
                dt.Columns.Add("C" + i.ToString(), typeof(float));
            }
            //add 10 rows data
            for (int j = 0; j < 10; j++)
            {
                DataRow dr = dt.NewRow();
                //Add dummy row to table
                dt.Rows.Add(dr);
                //Update row cells that just added
                for (int i = 0; i < ColCnt; i++)
                {
                    dt.Rows[dt.Rows.Count-1]["C" + i.ToString()] = i * 1.1;
                }
            }

大家看出来区别了吧,有人会问为什么要用第二种方法呢,第一种方法就是最常用的呀。是的,我们一般情况下都是用第一种方式比较多。但是实际在添加数据的时候并不都是可以一开始就把数据填充好的,好多时候都是再动态添加行列,动态更新数据的,这就难免会碰到先添加行(可能已有部分cell数据了),后面有需要大量更新一些cell的数据。

这个例子只是给使用Datatable特殊用途(特别是在大量数据时)的码农们提供一些思路:DataRow添加到DataTable之后再更新是一项非常消耗资源的工作,网上解释是DataRow加入Table后再编辑,系统会自动添加很多状态变量以及缓存空间操作,我们更新一个Cell的数据,可能系统做了几十次额外的操作

参考文章

https://stackoverflow.com/questions/28244558/extreme-performance-difference-when-using-datatable-add

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值