찾다
데이터 베이스MySQL 튜토리얼怎么提高ArcSDE for Oracle写入地理数据库的效率

很多用户经常会有将数据写入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#//000100000047000000


1:使用多线程

说实话,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)
      备注:测试结果中时间单位为秒

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


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操作
更新游标(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);
<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;


2:禁用表空间日志

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;


3:当用户只需完毕之后,在进行表空间日志启用和归档日志的启用即可。


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

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


성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
如何在技嘉主板上设置键盘启动功能 (技嘉主板启用键盘开机方式)如何在技嘉主板上设置键盘启动功能 (技嘉主板启用键盘开机方式)Dec 31, 2023 pm 05:15 PM

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

神舟炫龙m7e8s3如何启用独立显卡直连?神舟炫龙m7e8s3如何启用独立显卡直连?Jan 04, 2024 am 09:24 AM

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

如何辨别耐克鞋子的真假鞋盒(掌握一招轻松识别)如何辨别耐克鞋子的真假鞋盒(掌握一招轻松识别)Sep 02, 2024 pm 04:11 PM

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

Win11如何回退版本?Win11如何回退版本?Jun 30, 2023 pm 05:21 PM

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

拯救者y7000p玩cf分辨率多少(拯救者y7000玩cf怎么调全屏)拯救者y7000p玩cf分辨率多少(拯救者y7000玩cf怎么调全屏)Jan 07, 2024 am 10:13 AM

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

如何通过PHP多线程提高数据库查询性能如何通过PHP多线程提高数据库查询性能Jun 29, 2023 pm 08:27 PM

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

如何把电脑的百兆网口升级为千兆网口?如何把电脑的百兆网口升级为千兆网口?Dec 31, 2023 pm 05:32 PM

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

如何查看和编辑SQL文件如何查看和编辑SQL文件Feb 26, 2024 pm 05:12 PM

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

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.