http://blog.csdn.net/lk103852503/article/details/6570748

修改一批要素的属性有多种方法,当数据量较大时,若选择不当可能会大大影响速度。

一、IRowBuffer 方法

此法适用于将一批数据更新为某一相同的属性。

IQueryFilter pFilter = new QueryFilterClass();
pFilter.WhereClause = "Z='T'";
pFilter.SubFields = "Z";
int nIndex = pFeatureClass.FindField("Z");
ITable pTable = pFeatureClass as ITable;
IRowBuffer pBuffer = pTable.CreateRowBuffer();
pBuffer.set_Value(nIndex, "TT");
pTable.UpdateSearchedRows(pFilter, pBuffer);
Marshal.ReleaseComObject(pFilter);

当所要更新的属性各不相同时,上述方法就不能用了。

二、逐条更新记录

这种方式中可有三种方法,如下:

(1)

for (int i = 0; i < pTable.RowCount(null); i++)
            {
                pRow = pTable.GetRow(i);
                pRow.set_Value(2, i + 6);
                pRow.Store();
            }

(2)

IFeatureCursor FCursor = pLayer.FeatureClass.Search(new QueryFilterClass(), false);
 IFeature feature = FCursor.NextFeature();

for (int i = 0; i < featureNum; i++)
            {

feature.set_Value(2, i);
                feature.Store();
                feature = FCursor.NextFeature();
            }

(3)

ICursor pCursor =pTable.Update(null, false);
            pRow = pCursor.NextRow();
            for (int i = 0; i < pTable.RowCount(null); i++)
            {
                pRow.set_Value(2, i + 6);
                pCursor.UpdateRow(pRow);
                pRow = pCursor.NextRow();

}
试验数据为320条记录,三种方法的运行时间为:法(1)为40297ms;法(2)34922ms为;法(3)为219ms.

可见运用IFeature和IRow的Store方法更新速度都很慢,用ICursor 的UpdateRow方法速度很快,分别是前两者效率的184倍、159倍!!完整测试代码如下:

IFeatureLayer pLayer = Utilities.GetLayerByName((string)cmbRegLayers.SelectedItem, m_mapControl) as IFeatureLayer;
            ITable pTable = pLayer.FeatureClass as ITable;
            int t = 0;

IFeatureCursor FCursor = pLayer.FeatureClass.Search(new QueryFilterClass(), false);
            IFeature feature = FCursor.NextFeature();
            int featureNum = pLayer.FeatureClass.FeatureCount(null);
            t = Environment.TickCount;
            for (int i = 0; i < featureNum; i++)
            {

feature.set_Value(2, i);
                feature.Store();
                feature = FCursor.NextFeature();
            }
            t = Environment.TickCount - t;
            MessageBox.Show(t.ToString());

t = Environment.TickCount;
            ICursor pCursor =pTable.Update(null, false);
            IRow pRow = pCursor.NextRow();
            for (int i = 0; i < pTable.RowCount(null); i++)
            {
                pRow.set_Value(2, i + 6);
                pCursor.UpdateRow(pRow);
                pRow = pCursor.NextRow();

}

t = Environment.TickCount - t;
            MessageBox.Show(t.ToString());

t = Environment.TickCount;
            for (int i = 0; i < pTable.RowCount(null); i++)
            {
                pRow = pTable.GetRow(i);
                pRow.set_Value(2, i + 6);
                pRow.Store();
            }

t = Environment.TickCount - t;
            MessageBox.Show(t.ToString());

Arcengine效率探究之二——属性的更新(转载)的更多相关文章

  1. 【转载】Arcengine效率探究之二——属性的更新

    文转载自hymyjl2010<Arcengine效率探究之二——属性的更新>   修改一批要素的属性有多种方法,当数据量较大时,若选择不当可能会大大影响速度. 一.IRowBuffer 方 ...

  2. Arcengine效率探究之一——属性的读取(转载)

    http://blog.csdn.net/lk103852503/article/details/6566652 在写一个对属性表的统计函数时,发现执行速度奇慢无比,百思不得其解,其实算法并不复杂,后 ...

  3. ArcGIS Engine效率探究——要素的添加和删除、属性的读取和更新

    ArcGIS Engine效率探究——要素的添加和删除.属性的读取和更新 来自:http://blog.csdn.net/freewaywalker/article/details/23703863 ...

  4. vue生命周期探究(二)

    vue生命周期探究(二) 转载自:https://segmentfault.com/a/1190000008923105 上一章我们介绍了vue的组件生命周期和路由勾子,这一章,让我们来看看在vue- ...

  5. 常用sql语句总结(二)(更新数据,序列,创建数据表,约束,注释)

    常用sql语句总结(二)(更新数据,序列,创建数据表,约束,注释) 一. 增 INSERT INTO 数据表(字段,字段,-) VALUES(值,值-); INSERT INTO emp(empno, ...

  6. fastJson在java后台转换json格式数据探究(二)--处理数组/List/Map

    作者:buster2014 推荐:长安散人 fastJson在java后台转换json格式数据探究(二)--处理数组/List/Map JSON字符串与Java对象的转换 1.将Java对象或Java ...

  7. 解决使用JPA时对象在set属性时更新了数据库问题

    https://www.jianshu.com/p/1100814ff54f 之前也遇到过一次这个问题,打印的日志中也可以看见update相关的sql语句,但当时不知道为什么会去自动更新,就用了别的方 ...

  8. vue 数组中嵌套的对象添加新属性--页面更新

    vue 数组中嵌套的对象添加新属性--页面更新:https://www.jianshu.com/p/8f0e5bb13735

  9. 支付宝防并发方案之"一锁二判三更新"

    每年支付宝在双11和双12的活动中,都展示了绝佳的技术能力.这个能力不但体现在处理高TPS量的访问,更体现在几乎不会出错,不会出现重复支付的情况,那这个是怎么做到的呢? 诚然,为了实现在高并发下仍不会 ...

随机推荐

  1. js常见执行方法window.onload = function (){},$(document).ready()

    1. window.onload = function(){}; 当页面DOM对象加载完毕,web浏览器能够运行JS时,此方法即被触发. 2. $(document).ready();当web页面以及 ...

  2. express+mysql+vue开发环境搭建

    最近开始做一个实验室资产管理系统,后台使用node.js的Express框架,前端使用vue,数据库使用mysql.在这里开始简单记录一下开发过程和遇到的问题. 今天要说的是express+mysql ...

  3. Spring之强制修改某个方法的行为(Arbitrary method replacement)

      A less commonly useful form of method injection than Lookup Method Injection is the ability to rep ...

  4. spring引入properties变量报错

    通过properties配置文件配置数据源,代码如下: <bean class="org.springframework.beans.factory.config.PropertyPl ...

  5. ps工具快捷键

    1.覆盖图片原先文件--- 自由转换 快捷键 ctrl+t 1)首先选择一个背景色 点击或者ctrl+t 处于自由切换状态  可以进行上下拉伸 回车即可. 这样就覆盖了文件,且背景色和我们之前的一样. ...

  6. 通过cgroup给docker的CPU和内存资源做限制

    1.cpu docker run -it --cpu-period=100000 --cpu-quota=2000 ubuntu /bin/bash 相当于只能使用20%的CPU 在每个100ms的时 ...

  7. defaultdict - update - pymysql

    defaultdict 的例子 使用list作为default_factory,他很容易的将一个以键值形式表现的序列分组成一个字典列表 >>> s = [('yellow', 1), ...

  8. shell编程的笔记

    关于历史命令 Shell相关 !! 是上一次执行的命令 !字符串  指执行最近一次以这个字符串开头的命令 !$ 取出上一条命令最后一个单词或命令 *匹配0个或多个字符         ?匹配一个字符 ...

  9. ETH—Lwip以太网通信

    第39章     ETH—Lwip以太网通信 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ...

  10. gcc 动态编译 动态库路径

    gcc 动态编译(共享库) 动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令优点:体积小,编译快缺点:依赖性高 代码如下: [root@74-82-173-21 ...