怎么提高ArcSDE 写入地理数据库的效率

link:
http://blog.csdn.net/linghe301/article/details/20900615

2014-03-14 09:20?2686人阅读?评论(6)?收藏?举报

?分类:

?
?

ArcSDE(193)??ArcGIS Engine(30)??ST_Geometry(30)??Oracle(106)??性能优化(53)?

版权声明:本文为博主原创文章,未经博主允许不得转载。

目录(?)[+]

很多用户经常会有将数据写入ArcSDE地理数据库的操作,也时常会写入效率而烦恼,它们渴望不管多大多复杂的数据,尽可能的使用较少的时间写入到ArcSDE中,而往往用户写入ArcSDE也通过依赖于本身的业务需求,使用自定义的代码开发就非常常见了,那影响ArcSDE写入效率的因素就比较多了。

----------------------------------------------------------------------------------

版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!

Blog: ? ? ? ? ? ? ? http://blog.csdn.net/linghe301

----------------------------------------------------------------------------------

代码因素

大多数用户可能还在使用ArcGIS Engine、空间SQL、ArcSDE API和WebAPI进行开发,针对后两者我不是很熟悉,也没有什么发言权,所以更多的以前面两种开发模式为例,看看在代码开发过程中是否有可以优化的余地。

?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ArcGIS Engine ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

以下部分可以参考2011年Esri中国开发者大会《Geodatabase高效编程_李圣虎》,特此感谢!

该文档建议ArcGIS Engine的开发者仔细学习,里面介绍了很多提高效率的技巧和细节!

http://wenku.baidu.com/link?url=mgCFXh23Q3fbRaBjOJr-LN1b24_pbH_UylNcTt1zZ_hNROqByNzj8nRpV4IZrKulMYod9jxiOOeN8WGRgx0Y0Z_vLvEAZsjw2KSz2Uj0w0K

?

另外大家也可以参考:Geodatabase API best practices?

http://resources.arcgis.com/en/help/arcobjects-net/conceptualhelp/index.html#//000100000047000000

?

1:使用多线程

说实话,ArcGIS Engine是否支持多线程,大家的理解是不一样的。用资深人士解释就是ArcGIS Engine支持多线程,但是不支持多个线程之间的彼此调用。

下面就以更新多个要素类的字段来演示一下多线程的使用方法,以下都是伪代码。

编写一个更新要素类的函数,输入参数为要素类名称

  1. public?class?VersionEditing??
  2. ???{??
  3. ???????///?<summary>??
  4. ???????///?更新要素类指定字段值??
  5. ???????///?</summary>??
  6. ???????///?<param?name="parameter">要素类名称</param>??
  7. ???????public?void?UpdateFiledValue(object?parameter)??
  8. ???????{??
  9. ????........??
  10. ???????}??
  11. ?????}??

    编写多线程函数,调用这个更新要素类的函数

  12. private?void?MultiThreadEditing()??
  13. ????????{??
  14. ????????????VersionEditing?VersionEditing?=?new?GIS.VersionEditing();??
  15. ????????????//声明线程对象??
  16. ????????????Thread?thA?=?new?Thread(new?ParameterizedThreadStart(VersionEditing.UpdateFiledValue));??
  17. ????????????Thread?thB?=?new?Thread(new?ParameterizedThreadStart(VersionEditing.UpdateFiledValue));??
  18. ????????????//设置线程工作模型??
  19. ????????????thA.SetApartmentState(ApartmentState.STA);??
  20. ????????????thB.SetApartmentState(ApartmentState.STA);??
  21. ????????????//启动线程??
  22. ????????????thA.Start("featureclass1");??
  23. ????????????thA.Start("featureclass2");??
  24. ????????}??

    ?

    2:使用游标进行地理数据库编辑

    如果是批量进行数据编辑,不建议用户使用传统的Create Feature+Store的方法,而是使用insertCursor或者Update Cursor的方法。

  25. //建议的方法??
  26. public?static?void?InsertFeaturesUsingCursor(IFeatureClass?featureClass,?List?<??
  27. ????IGeometry?>?geometryList)??
  28. {??
  29. ????using(ComReleaser?comReleaser?=?new?ComReleaser())??
  30. ????{??
  31. ????????//?Create?a?feature?buffer.??
  32. ????????IFeatureBuffer?featureBuffer?=?featureClass.CreateFeatureBuffer();??
  33. ????????comReleaser.ManageLifetime(featureBuffer);??
  34. ??
    ?
  35. ????????//?Create?an?insert?cursor.??
  36. ????????IFeatureCursor?insertCursor?=?featureClass.Insert(true);??
  37. ????????comReleaser.ManageLifetime(insertCursor);??
  38. ??
    ?
  39. ????????//?All?of?the?features?to?be?created?are?classified?as?Primary?Highways.??
  40. ????????int?typeFieldIndex?=?featureClass.FindField("TYPE");??
  41. ????????featureBuffer.set_Value(typeFieldIndex,?"Primary?Highway");??
  42. ????????foreach?(IGeometry?geometry?in?geometryList)??
  43. ????????{??
  44. ????????????//?Set?the?feature?buffer‘s?shape?and?insert?it.??
  45. ????????????featureBuffer.Shape?=?geometry;??
  46. ????????????insertCursor.InsertFeature(featureBuffer);??
  47. ????????}??
  48. ??
    ?
  49. ????????//?Flush?the?buffer?to?the?geodatabase.??
  50. ????????insertCursor.Flush();??
  51. ????}??
  52. }??

    ? ? ? 测试场景:从本地File Geodatabase中读取数据,向ArcSDE Geodatabase要素类中插入读取的数据;
    ?
    ?
    ?
    数据情况:简单的线要素类,2721089条记录;
    ?
    ?
    ?
    测试环境:硬件(T9600 CPU 4G内存)软件(Windows 7 64Bit Oracle 11g ArcGIS 10)
    ?
    ?
    ?
    备注:测试结果中时间单位为秒

    ?

    3:游标

    游标分为类绑定游标: SearchCursor、UpdateCursor、InsertCursor和非类绑定游标:QueryDef Cursor。在使用游标使用过程中经常会遇到如下情况

  53. Public?Void?test()??
  54. {??????????????????
  55. ????????workspaceEdit.StartEditOperation();??
  56. ????????????????IQueryFilter?queryFilter?=?new?QueryFilter();??
  57. ????????????????queryFilter.WhereClause?=?clause;??
  58. ????????????????//是否重复绑定游标??
  59. ????????????????ICursor?updateCursor?=?table.Update(queryFilter,?true);??
  60. ????????????????comReleaser.ManageLifetime(updateCursor);??
  61. ????????????????int?fieldIndex?=?table.Fields.FindField("FWMC");??
  62. ????????????????IRow?temp?=?null;??
  63. ????????????????while?((temp?=?updateCursor.NextRow())?!=?null)??
  64. ????????????????{??
  65. ????????????????????temp.set_Value(fieldIndex,?"aaaa");??
  66. ????????????????????updateCursor.UpdateRow(temp);??
  67. ????????????????}??
  68. ????????????????workspaceEdit.StopEditOperation();??
  69. }??

    如果选择TRUE,说明使用资源回收游标,但是下一个游标还指向同一个内存地址,如果是FALSE,说明资源回收游标和内存地址,下一个游标还需要重新分配一个新的内存地址,这样无疑增加了服务器资源的开销,所以没有特殊需求,建议使用TRUE。

    ?

    关于游标的相关提示:

    查询游标(Search Cursor)

  • 在编辑会话中初始化SearchCursor可能导致缓存记录提交到数据库(触发DBMS写操作)
  • 通过SearchCursor获得的行支持Store和Delete操作

更新游标(Update Cursor)

  • 必须使用UpdateCursor提供的的UpdateRow和DeleteRow方法对通过UpdateCursor获得的行进行更新和删除操作
  • UpdateCursor提供的UpdateRow方法只能针对通过UpdateCursor获得的当前行进行操作
  • UpdateCursor不支持跨编辑操作使用,打开一个新的编辑操作时必须初始化一个新的更新游标
  • 使用UpdateCursor对复杂要类类进行更新时必须处于一个编辑会话中

插入游标(Insert Cursor)

  • 主要用于批量要素插入
  • 使用缓存,定时调用Flush将缓存写入数据库,调用InsertRow和Flush方法时要捕捉异常
  • 使用InsertCursor时关闭空间缓存

QueryDef 游标

  • 不能针对通过QueryDef Cursor获得的行进行Store和Delete操作
  • 在编辑会话中使用QueryDef Cursor会导致缓存提交到数据库

4:资源回收

尽可能使用Esri提供的MangeLifetime来管理ArcGIS Engine对象的生命周期,系统会自动进行维护,而不需要在使用类似以下方式进行释放资源了。(由于版本原因,可能有所不同)

?ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(o);

System.Runtime.InteropServices.Marshal.ReleaseComObject(o);

GC.Collect();

?

5:如果可能化,使用缓存来提高效率

  1. ///?<summary>??
  2. ????????///?执行空间缓存??
  3. ????????///?</summary>??
  4. ????????///?<param?name="pFWS">工作空间</param>??
  5. ????????///?<param?name="pEnv">缓存区域</param>??
  6. ????????private?void?SpatialCache(IFeatureWorkspace?pFWS,?IEnvelope?pEnv)??
  7. ????????{??
  8. ????????????if?(m_pWS?!=?null)??
  9. ????????????{??
  10. ????????????????ISpatialCacheManager3?pSCM?=?m_pWS?as?ISpatialCacheManager3;??
  11. ????????????????if?(!pSCM.CacheIsFull)??
  12. ????????????????{??
  13. ????????????????????pSCM.FillCache(pEnv);??
  14. ????????????????}??
  15. ??
    ?
  16. ????????????????//执行空间操作代码??
  17. ??
    ?
  18. ????????????????//清空缓存??
  19. ??
    ?
  20. ????????????????pSCM.EmptyCache();??
  21. ????????????????
    ?
  22. ????????????}??
  23. ????????}??

    ?

    更多了解:http://resources.arcgis.com/en/help/arcobjects-net/componenthelp/index.html#//002500000831000000

    ?

    6:如果可能的话,尽可能的使用GP工具来代替开发

    ArcGIS Desktop的性能无疑是最优化的,而且最大的好处就是实现了用户可以使用的ArcToolbox工具,而且ArcGIS Engine也可以进行调用,比如将一个File Geodatabase导入到ArcSDE 地理数据库中,用户就可以直接使用Copy_Feature工具进行操作。

    ?

    7:是否必须使用版本化编辑

    ArcGIS不仅支持版本编辑,也支持非版本编辑,所以并不是所有情况必须使用版本化编辑,大家都知道注册版本后编辑一段时间会导致效率低下,但是有些用户在一开始接触ArcGIS编辑时只知道必须注册版本才能编辑,但是它的业务情况可能并不需要必须注册版本,比如只是编辑一下属性字段值等情况,所以这个时候可能选择非版本编辑效率更高。

    IDatasetEdit

    ?

    更多参考:http://resources.arcgis.com/en/help/arcobjects-net/componenthelp/index.html#/IDatasetEdit_Interface/00250000015m000000/

    ?

    用户也可以查看《Geodatabase高效编程_李圣虎》总结的常见开发错误,都是一些比较典型的可能导致效率的案例。

    ?

    ?

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 空间SQL ?
    ?
    ?
    ?
    ?
    ?
    ?
    ?
    ?
    ? ? ? ? ? ? ? ? ? ? ? ?

    对空间SQL的开发其实就是用户的SQL语句的基本功是否扎实。

    1:SQL语句语法和效率

    ????在SQL中,索引是提高查询效率的必要条件,尤其是WHERE子句的查询字段必须要创建索引才能提高查询效率,如果没有WHERE条件在查询中使用了MIN、MAX、COUNT函数的字段也需要创建索引。还有很多情况用户尽管创建了索引对象但效率依然低下,这是因为有些SQL运算符是会将索引失效的。

    ?

  • ?使用不等于运算符(<>、!=)

????在WHERE中使用不等于条件,将会使索引失效。

?

  • 使用 IS NULL或IS NOT NULL

????在WHERE子句中使用IS NULL或者IS NOT NULL同样会限制索引的使用。如果被索引的列在某些行中存在NULL值,在索引列中就不会有相应的条目。(例外:位图索引对于NULL列也会进行记录,因此位图索引对于NULL搜索通常较为快速)。

?

  • 使用函数

????如果不使用基于函数的索引,那么在SQL语句的WHERE子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。一些常见的函数:TRUNC、SUBSTR、TO_DATE、TO_CHAR、INSTR等,都可能会使索引失效。

?

  • ?比较不匹配的数据类型

????这个是比较难于发现的问题。ORACLE不会对不匹配的数据类型报错,ORACLE会隐式地把VARCHAR2列的数据类型转换成要被比较的数值型数据类型。

?

如果是使用ST_geometry函数的话,还需要注意对ST_Geometry函数的使用

具体可以参考:

http://blog.csdn.net/linghe301/article/category/797871

?

2:尽可能的使用存储过程

如果可能的话,尽可能的使用存储过程来代替原始的单个SQL语句,这里面就不再解释存储过程的好处了。

?

3:使用绑定变量而不是传入固定的值

?

?

----------------------------------------------------------------------------------

版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!

Blog: ? ? ? ? ? ? ? http://blog.csdn.net/linghe301

----------------------------------------------------------------------------------

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 网络因素? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

网络的原因也是用户需要注意的,如果你的网络带宽、延迟都有问题,肯定会影响数据传输的效率的。这里我只是指出这是一个影响因素,因为不专业,所以不去更多的分析这个问题,但是用户需要留意该问题。

----------------------------------------------------------------------------------

版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!

Blog: ? ? ? ? ? ? ? http://blog.csdn.net/linghe301

----------------------------------------------------------------------------------

?

? ? ? ? ? ? ? ? ? ArcSDE地理数据库因素(以Oracle为例)
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
??

1:空间索引问题

在ArcSDE地理数据库编辑过程中,系统会自动维护该编辑要素对象的空间索引,那么就会耗费一定的服务器资源,特别是在大数据量进行数据插入的过程中,无需进行空间索引的创建,可以等批量插入完成之后,统一创建空间索引,这样无疑就提高了操作效率。

ArcGIS Desktop、ArcToolbox、ArcSDE命令行、Python都提供了管理空间索引的方法,当然ArcGIS Engine也提供了管理空间索引的接口

时间: 2025-01-13 22:52:04

怎么提高ArcSDE 写入地理数据库的效率的相关文章

PHP 文件锁flock的妙用 提高文件写入效率 锁住文件达到保护的目的

案例情况: 有一任务需要采集数据很久,但是采集过程中操作人员偶尔会犯2个毛病: 1.不知道这时采集到哪儿了 2.不知道采集到的数据是否正确 3.不知道是不是写入文件太慢了,有效率问题? 种种原因导致操作人员无意中打开正在写入的文件... 这时就悲剧了,有可能会导致文件写入数据不完整.... 有些程序员使用的写入本地文件是这样的[文件I/O低效!]: <?php for($p = 1; $p <= 100000; $p++){ file_put_contents('product.csv', '

如何提高短平快项目的测试效率?

                         如何提高短平快项目的测试效率?                                                    研发资深顾问  杨学明   最近几年,笔者在全国各地包括深圳,北京,上海,杭州,武汉,济南等大中城市开设了近百场测试公开课程,也帮助许多创新型企业进行了产品测试或软件测试管理的内训,大的企业有中航工业.中科院.中国电力研究院.华立仪表.深圳迈瑞等等,也有一些中小型的企业,总体来说,目前中国国内的各公司的测试体系还不

提高Order by语句查询效率的两个思路

提高Order by语句查询效率的两个思路 2011-03-01 13:07 水太深 ITPUB 字号:T | T 在MySQL数据库中,Order by语句的使用频率是比较高的.但是众所周知,在使用这个语句时,往往会降低数据查询的性能.因为可能需要对数据库的记录进行重新排序.在这篇文章中,笔者就谈谈提高Order By语句查询效率的两个思路,以供大家参考. AD: 在MySQL数据库中,Order by语句的使用频率是比较高的.但是众所周知,在使用这个语句时,往往会降低数据查询的性能.因为可能

管理案例:如何提高项目周例会的效率和效果?

案例描述:李工是某互联网公司产品技术部项目经理,李工已拥有近3年的项目管理经验,成功领导了4个小型产品项目的研发工作.2014年5月份之前,李工管理的项目团队都是只有7.8个人左右的规模,他组织召开项目的周例会时,采用的方式如下:周例会一般是半个小时左右的时间,项目组所有成员先各自报告前一星期的工作,然后讨论遇到的问题及解决方案:项目经理李工展示项目组前一星期的工作进展,同时布置本周的工作任务.一直以来,李工对这种方式的项目周例会所取得的效果很满意.2014年6月开始,李工被安排负责一个中等规模

如何阅读源码,如何提高阅读源码的效率

就我自己阅读安卓源码的经验,本人研究过 settings,launcher,Sysupdate ,framework /services ,recovery的部分源码,并且成功修改google留下来的bug. 如果就是熟悉代码,不带问题的去看,看的会比较累,但是仍然是有方法可以借鉴的,其实这个方法,也是生活经验得来的,大家都会的. 就是从整体到局部,由总而分. 比如:你想了解recovery的代码,就应该先了解这个Recovery的运作流程,网上有很多人总结了,总概括图,先有个大概的了解: 第二

EJB通过ANT提高EJB应用的开发效率、开发具有本地接口的无状态bean、开发有状态bean

把jboss集成进eclipse 关闭Jboss控制台按Ctrl+c,在MyEclipse→Servers→Jboss里面可以配置JBoss. 通过ANT提高EJB应用的开发效率 在HelloWorld 加入ANT,右击项目新建xml:build.xml,右击打开方式选择Ant .. 对应用进行编译.打包.发布.解发布 <?xml version="1.0" encoding="UTF-8"?> <!--basedirz项目所在路径,.代表在bui

oracle 性能优化操作七:索引提高数据分布不均匀时查询效率

索引的选择性低,但数据的值分布差异很大时,仍然可以利用索引提高效率. A.数据分布不均匀的特殊情况下,选择性不高的索引也要创建. 表ServiceInfo中数据量很大,假设有一百万行,其中有一个字段DisposalCourseFlag,取值范围为枚举值:[0,1,2,3,4,5,6,7]. 按照前面说的索引建立的规则,"选择性不高的字段不应该建立索引", 该字段只有8种取值,索引值的重复率很高,索引选择性明显很低,因此不建索引. 然而,由于该字段上数据值的分布情况非常特殊,具体如下表:

(zz)作为 IT 从业人员,你觉得有什么工具大大提高了你的工作效率?

作为 IT 从业人员,你觉得有什么工具大大提高了你的工作效率? 原文地址:https://www.cnblogs.com/bmrs/p/8560874.html

如何提高scrapy的爬取效率

提高scrapy的爬取效率 增加并发: 默认scrapy开启的并发线程为32个,可以适当进行增加.在settings配置文件中修改CONCURRENT_REQUESTS = 100值为100,并发设置成了为100. 降低日志级别: 在运行scrapy时,会有大量日志信息的输出,为了减少CPU的使用率.可以设置log输出信息为INFO或者ERROR即可.在配置文件中编写:LOG_LEVEL = ‘INFO’ 禁止cookie: 如果不是真的需要cookie,则在scrapy爬取数据时可以进制coo