很多用户经常会有将数据写入ArcSDE地理数据库的操作,也时常会写入效率而烦恼,它们渴望不管多大多复杂的数据,尽可能的使用较少的时间写入到ArcSDE中,而往往用户写入ArcSDE也通过依赖于本身的业务需求,使用自定义的代码开发就非常常见了,那影响ArcSDE写
很多用户经常会有将数据写入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#//0001000000470000001:使用多线程
说实话,ArcGIS Engine是否支持多线程,大家的理解是不一样的。用资深人士解释就是ArcGIS Engine支持多线程,但是不支持多个线程之间的彼此调用。
下面就以更新多个要素类的字段来演示一下多线程的使用方法,以下都是伪代码。
编写一个更新要素类的函数,输入参数为要素类名称
public class VersionEditing { /// <summary> /// 更新要素类指定字段值 /// </summary> /// <param name="parameter">要素类名称 public void UpdateFiledValue(object parameter) { ........ } }编写多线程函数,调用这个更新要素类的函数
private void MultiThreadEditing() { VersionEditing VersionEditing = new GIS.VersionEditing(); //声明线程对象 Thread thA = new Thread(new ParameterizedThreadStart(VersionEditing.UpdateFiledValue)); Thread thB = new Thread(new ParameterizedThreadStart(VersionEditing.UpdateFiledValue)); //设置线程工作模型 thA.SetApartmentState(ApartmentState.STA); thB.SetApartmentState(ApartmentState.STA); //启动线程 thA.Start("featureclass1"); thA.Start("featureclass2"); }
2:使用游标进行地理数据库编辑
如果是批量进行数据编辑,不建议用户使用传统的Create Feature+Store的方法,而是使用insertCursor或者Update Cursor的方法。
//建议的方法 public static void InsertFeaturesUsingCursor(IFeatureClass featureClass, List geometryList) { using(ComReleaser comReleaser = new ComReleaser()) { // Create a feature buffer. IFeatureBuffer featureBuffer = featureClass.CreateFeatureBuffer(); comReleaser.ManageLifetime(featureBuffer); // Create an insert cursor. IFeatureCursor insertCursor = featureClass.Insert(true); comReleaser.ManageLifetime(insertCursor); // All of the features to be created are classified as Primary Highways. int typeFieldIndex = featureClass.FindField("TYPE"); featureBuffer.set_Value(typeFieldIndex, "Primary Highway"); foreach (IGeometry geometry in geometryList) { // Set the feature buffer's shape and insert it. featureBuffer.Shape = geometry; insertCursor.InsertFeature(featureBuffer); } // Flush the buffer to the geodatabase. insertCursor.Flush(); } }
测试场景:从本地File Geodatabase中读取数据,向ArcSDE Geodatabase要素类中插入读取的数据;
数据情况:简单的线要素类,2721089条记录;
测试环境:硬件(T9600 CPU 4G内存)软件(Windows 7 64Bit Oracle 11g ArcGIS 10)
备注:测试结果中时间单位为秒
3:游标
游标分为类绑定游标: SearchCursor、UpdateCursor、InsertCursor和非类绑定游标:QueryDef Cursor。在使用游标使用过程中经常会遇到如下情况
Public Void test() { workspaceEdit.StartEditOperation(); IQueryFilter queryFilter = new QueryFilter(); queryFilter.WhereClause = clause; //是否重复绑定游标 ICursor updateCursor = table.Update(queryFilter, true); comReleaser.ManageLifetime(updateCursor); int fieldIndex = table.Fields.FindField("FWMC"); IRow temp = null; while ((temp = updateCursor.NextRow()) != null) { temp.set_Value(fieldIndex, "aaaa"); updateCursor.UpdateRow(temp); } workspaceEdit.StopEditOperation(); }
如果选择TRUE,说明使用资源回收游标,但是下一个游标还指向同一个内存地址,如果是FALSE,说明资源回收游标和内存地址,下一个游标还需要重新分配一个新的内存地址,这样无疑增加了服务器资源的开销,所以没有特殊需求,建议使用TRUE。
关于游标的相关提示:
查询游标(Search Cursor)
- 在编辑会话中初始化SearchCursor可能导致缓存记录提交到数据库(触发DBMS写操作)
- 通过SearchCursor获得的行支持Store和Delete操作
- 必须使用UpdateCursor提供的的UpdateRow和DeleteRow方法对通过UpdateCursor获得的行进行更新和删除操作
- UpdateCursor提供的UpdateRow方法只能针对通过UpdateCursor获得的当前行进行操作
- UpdateCursor不支持跨编辑操作使用,打开一个新的编辑操作时必须初始化一个新的更新游标
- 使用UpdateCursor对复杂要类类进行更新时必须处于一个编辑会话中
- 主要用于批量要素插入
- 使用缓存,定时调用Flush将缓存写入数据库,调用InsertRow和Flush方法时要捕捉异常
- 使用InsertCursor时关闭空间缓存
- 不能针对通过QueryDef Cursor获得的行进行Store和Delete操作
- 在编辑会话中使用QueryDef Cursor会导致缓存提交到数据库
4:资源回收
尽可能使用Esri提供的MangeLifetime来管理ArcGIS Engine对象的生命周期,系统会自动进行维护,而不需要在使用类似以下方式进行释放资源了。(由于版本原因,可能有所不同)
ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(o);
<span>System.Runtime.InteropServices.Marshal.ReleaseComObject(o);</span>
<span>GC.Collect();</span>
5:如果可能化,使用缓存来提高效率
/// <summary> /// 执行空间缓存 /// </summary> /// <param name="pFWS">工作空间 /// <param name="pEnv">缓存区域 private void SpatialCache(IFeatureWorkspace pFWS, IEnvelope pEnv) { if (m_pWS != null) { ISpatialCacheManager3 pSCM = m_pWS as ISpatialCacheManager3; if (!pSCM.CacheIsFull) { pSCM.FillCache(pEnv); } //执行空间操作代码 //清空缓存 pSCM.EmptyCache(); } }
更多了解: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编辑时只知道必须注册版本才能编辑,但是它的业务情况可能并不需要必须注册版本,比如只是编辑一下属性字段值等情况,所以这个时候可能选择非版本编辑效率更高。
<h1 id="IDatasetEdit">IDatasetEdit</h1>
更多参考: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也提供了管理空间索引的接口
IFeatureClassLoad.LoadOnlyMode
2:如果进行更新操作,就需要留意索引
用户进行更新,需要先查询出需要更新的要素对象,那么不管是通过属性索引或者空间索引进行查询,都需要这些索引对象有效。
而且在编辑完毕之后,还需要对这些索引对象重新创建,保证新编辑对象的索引更新。
3:数据库归档日志关闭
如果是大数据量插入操作,如果没有特殊要求,可以将Oracle的归档日志进行关闭,因为归档日志主要记录数据的更高,特别是数据的修改和删除,对数据新增操作其实无需打开数据库归档,如果打开,系统会在批量新增数据的同时,写入大量的归档日志信息,也无疑也会降低编辑效率。
4:禁用表空间日志
虽然数据库的归档日志禁用之后,只是说数据库不再产生具体的归档日志文件,但是还需要进行非归档的循环日志写入,那么如果完全禁用日志的生成,需要禁用操作用户的表空间日志,这样在插入数据之后,系统就会记录比较少的日志信息。
启用日志(Logging):用户进行表创建、索引创建、分区以及后续插入等操作产生REDO日志,作为数据恢复的依据。
禁用日志(No Logging):以上相关操作不会产生REDO日志,进而也不能进行数据恢复,但是数据加载效率会大幅度提高。
注意:这些操作是用户进行大数据量新增条件下,而且具有Oracle数据库知识的用户操作。
操作示例:
1:禁用归档日志
sqlplus / as sysdba
shutdown immediate;
startup mount;
alter database flashback off;
alter database noarchivelog;
alter database open;
select flashback_on from v$database;
archive log list;
sqlplus /nolog
connect / as sysdba;
select 'ALTER TABLESPACE ' || CHR(34) || NAME || CHR(34) || 'NOLOGGING;'
FROM V$TABLESPACE
WHERE NAME NOT IN ('SYSTEM','SYSAUX','USERS','TEMP','UNDOTBS1')ORDER BY NAME;
ALTER TABLESPACE "PM_BDATA" NOLOGGING;
ALTER TABLESPACE "PM_BINDEX" NOLOGGING;
ALTER TABLESPACE "PM_BDATA_TOPO" NOLOGGING;
4:启用表空间日志
sqlplus /nolog
connect / as sysdba;
select 'ALTER TABLESPACE ' || CHR(34) || NAME || CHR(34) || 'LOGGING;'
FROM V$TABLESPACE
WHERE NAME NOT IN ('SYSTEM','SYSAUX','USERS','TEMP','UNDOTBS1')ORDER BY NAME;
ALTER TABLESPACE "PM_BDATA" LOGGING;
ALTER TABLESPACE "PM_BINDEX" LOGGING;
ALTER TABLESPACE "PM_BDATA_TOPO" LOGGING;
5:启用归档日志
sqlplus / as sysdba
alter system set db_recovery_file_dest_size=10G scope=spfile;
alter system setdb_recovery_file_dest='C:\oradata\flash_recovery_area' scope=spfile;
alter system setlog_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST' scope=spfile;
shutdown immediate;
startup mount;
alter database archivelog;
alter database flashback on;
alter database open;
select flashback_on from v$database;
archive log list;
5:版本编辑的状态压缩
这个问题我就不再赘述了,该博客无数次提及这个问题,感兴趣的用户可以在本博客搜索“版本压缩”或者“Compress”。
6:Oracle参数
比如足够大的SGA和PGA,典型Oracle参数的设置如Open_Cusors、db_writer_processes等
7:其他因素
当然,如果用户的硬件环境足够好,比如数据与索引分开存储、分区表、RAC架构等也会为批量写入数据提高效率。
注意;严格禁止用户在OLTP环境下使用Oracle的并行计算,因为这样会严重造成资源占用问题。
----------------------------------------------------------------------------------
Blog: http://blog.csdn.net/linghe301
----------------------------------------------------------------------------------

技嘉的主板怎么设置键盘开机首先,要支持键盘开机,一定是PS2键盘!!设置步骤如下:第一步:开机按Del或者F2进入bios,到bios的Advanced(高级)模式普通主板默认进入主板的EZ(简易)模式,需要按F7切换到高级模式,ROG系列主板默认进入bios的高级模式(我们用简体中文来示范)第二步:选择到——【高级】——【高级电源管理(APM)】第三步:找到选项【由PS2键盘唤醒】第四步:这个选项默认是Disabled(关闭)的,下拉之后可以看到三种不同的设置选择,分别是按【空格键】开机、按组

神舟炫龙m7独显直连怎么开要开启神舟炫龙m7的独立显卡直连功能,您可以按照以下步骤进行操作:1.首先,确保您已经安装好了独立显卡的驱动程序。您可以前往神舟官方网站或独立显卡厂商官网下载并安装适合您显卡型号的最新驱动程序。2.在电脑桌面上,右键单击空白处,在弹出的菜单中选择“NVIDIA控制面板”(如果是AMD显卡,则选择“AMDRadeon设置”)。3.在控制面板中,找到“3D设置”或类似命名的选项,点击进入。4.在“3D设置”中,您需要找到“全局设置”或类似命名的选项。在这里,您可以指定使用独

耐克作为全球知名的运动品牌,其鞋子备受瞩目。然而,市场上也存在大量的假冒伪劣商品,其中就包括假冒的耐克鞋盒。辨别真假鞋盒对于保护消费者的权益至关重要。本文将为您提供一些简单而有效的方法,以帮助您辨别真假鞋盒。一:外包装标题通过观察耐克鞋盒的外包装,可以发现许多细微的差异。真正的耐克鞋盒通常具有高品质的纸质材料,手感光滑,且没有明显的刺激性气味。正品鞋盒上的字体和标志通常清晰、精细,并且没有模糊或颜色不协调的情况。二:LOGO烫金标题耐克鞋盒上的LOGO通常是烫金工艺,真品鞋盒上的烫金部分会呈现出

Win11怎么退版本?很多朋友在升级了win11后认为其不好用,那么大家可以选择退回之前的版本哦。那么你知道该如何操作嘛?很多用户都不知道,其实方法并不难,下面小编给大家带来退回Win10的方法分享,一起来学习吧。退回Win10的方法分享1、进入“设置”。2、选择“WindowsUpdate”,然后点击“恢复”。3、在“恢复选项”中选择“以前版本的Windows”,点击“返回”。4、选择原因,然后点击“下一步”。5、你将看到“检查更新”的通知,选择“不,谢谢”。6、阅读需要了解的内容,然后点击“

拯救者y7000p玩cf分辨率多少拯救者Y7000P玩CF的分辨率为1920*1080。因为该电脑配备了GTX1650显卡和i5-9300H处理器,性能较为优秀,足以满足CF这类游戏的需求。同时,1920*1080是目前主流电竞显示器的分辨率,画质清晰度足够。另外,如果有更高要求的玩家,可以适当降低游戏画质的设置,以获得更加流畅的游戏体验。为了享受更清晰的视觉体验,你可以将拯救者y7000p的分辨率调整为2560*1400。这样,你将能够享受到更高质量的图像显示。拯救者Y7000P2022款搭载

如何通过PHP多线程提高数据库查询性能引言:随着互联网的迅猛发展,数据库查询性能成为了开发者面临的重要挑战之一。而PHP作为一种广泛使用的服务器端脚本语言,对于数据库查询也扮演着重要的角色。本文将探讨如何通过PHP多线程技术提高数据库查询性能,以满足高并发请求的需求。一、什么是多线程在讨论如何利用多线程提高数据库查询性能前,我们首先需要了解什么是多线程。通俗

电脑100兆网口怎么变成千兆的要将电脑的100兆网口升级为千兆网口,一般需要按照以下步骤进行操作:1.确认网卡是否支持千兆网速:首先需要确认电脑上的网卡是否支持千兆以太网,如果不支持的话就无法实现将100兆网口提速至千兆。2.更换网线:要实现千兆网速,需要使用Cat5e或更高规格的网线,因为Cat5e网线可以支持千兆以太网,而对于100兆以太网来说则只需使用Cat5网线即可。3.更改网卡驱动程序:如果您的网卡支持千兆以太网,则需要更新网卡的驱动程序。可以前往网卡制造商的官方网站,下载并安装最新的

SQL文件是一种文本文件,通常包含了一系列的SQL语句。要打开SQL文件,可以使用文本编辑器或者专门的SQL开发工具。使用文本编辑器打开SQL文件最简单的方法是使用文本编辑器,例如Windows中的记事本、Notepad++,或者Mac中的文本编辑器。下面是打开SQL文件的步骤:首先,找到要打开的SQL文件,右键点击该文件,并选择“打开方式”。在弹出的窗口中


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

MinGW - Minimalist GNU for Windows
This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

ZendStudio 13.5.1 Mac
Powerful PHP integrated development environment

VSCode Windows 64-bit Download
A free and powerful IDE editor launched by Microsoft

DVWA
Damn Vulnerable Web App (DVWA) is a PHP/MySQL web application that is very vulnerable. Its main goals are to be an aid for security professionals to test their skills and tools in a legal environment, to help web developers better understand the process of securing web applications, and to help teachers/students teach/learn in a classroom environment Web application security. The goal of DVWA is to practice some of the most common web vulnerabilities through a simple and straightforward interface, with varying degrees of difficulty. Please note that this software

mPDF
mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),