ArcView 3.x Avenue位图(Tabs?)与ArcView 10 Python光标


9

注意:尽管这个问题有答案,但是对优化游标过程的其他提示将不胜感激。我将监视任何更新。

目前,我的老板(在Avenue工作)和我(在Python中工作)都试图解决同一问题。相反,我们都解决了这个问题,但是至少可以说,我们的解决方案的运行速度是不相干的。他的脚本在2个小时内所处理的内容最多可能达到6个。语法和逻辑实现方面的唯一真正区别在于3.x的位图和10.x的游标。我们两个:

1)存储表1中的值
。2)使用这些值查询表2中的一行
。3)存储表2中的值,作为新行插入表3中。

在这两个脚本中,这些过程都是在两个嵌套循环中完成的。在我开始探索代码优化的美好世界之前,将Avenue脚本性能与Python进行比较时,是否会发生这种情况?在操作时间方面,这并不是他的脚本第一次超过我的脚本,因此我想知道在为恐怖的脚本而钉死自己之前是否应该注意一些事情。

这是我的脚本,没有多余的地方:

import arcpy
import time
import sys
import os

def recordfindcopy(inFile,query,outFile):
    findRecord = arcpy.SearchCursor(inFile,query)
    for record in findRecord:
        copyRecord = arcpy.InsertCursor(outData) # <--- D'oh! (See answer)
        field = record.FIELD
        copy = copyRecord.newRow()
        copy.FIELD = field
        copyRecord.insertRow(copy)

StreetsFileList = [r"Path", 
                r"Path"]

for sfile in StreetsFileList:
    inStreets = sfile
    inTable = r"Path"
    outData = r"Path"
    fsaEntry = arcpy.SearchCursor(inTable)
    for row in fsaEntry:
        id = row.ID
        sQuery = "ID = %s " % (str(id))
        recordfindcopy(inStreets,sQuery,outData)

编辑:到目前为止,鉴于一些评论,我想知道是否可能有更好的方法通过联接执行此操作,尽管鉴于表的brobdingnagian(一天中的单词!)大小,我还是很怀疑。处理的核心是将一个表中的信息附加到第二个表中的任何匹配记录,并创建仅包含重要字段的第三个表。我想使用SDE进行尝试,但这似乎不是可用的选项。有什么想法吗?如果我的问题总是那么复杂,我深表歉意,但我想尽力解决长期困扰的问题。

回答:仅Jakub的简单建议就将处理时间从每500条记录30秒减少到每500条记录3秒。在每个插入上重新启动插入游标会大大降低速度(显然)。尽管与ArcView 3.x的速度相比,这可能不是该过程可以做的最优化,但就我目前的目的而言,这已经足够了。欢迎进一步的建议!


1
想要发布您的脚本?我不知道使用GP基准测试的任何途径/ python。
Derek Swingley 2011年

在旧的ArcView 3.2(大道)中,表联接和查询要比任何ArcGIS 8.x至10. * arcpy / python快得多。基本上是由于ArcGIS产品中的代码量(更多)。
Mapperz

2
@Mapperz你说得对。但是,由于每个请求的10,000X解释性开销,ArcView 3.x中的逐行处理速度非常慢(我已经对此进行了基准测试)。当可以避免循环时(如您所建议的那样使用联接和查询之类的“高级”请求),ArcView 3.x可以胜过ArcGIS,但在涉及对记录进行显式循环的直接测试中,这似乎是有道理的,任何人都可以以相对微弱的优势获胜。
whuber

@Whuber @德里克塔尔。
纳撒努斯2011年

Answers:


2

我对编程不是新手,但对Python还是很陌生,因此请耐心等待...

copyRecord = arcpy.InsertCursor(outData)

是否应该在For Next循环之前设置插入光标?在我看来,如果将“ out”数据的路径存储在“ outData”变量中,则无需在每次迭代时都将其重置。我认为这应该可以大大加快速度。


接得好。下周我回到办公室时,我会尝试一下。
纳撒努斯2011年

5

我假设您正在使用ArcPy或大约9.3的arcgisscripting。无论哪种方式,这里的技术都可以加快您的处理速度。

第一件事是执行查找,并且使用除内存之外的任何其他介质进行插入都会减慢您的进程。Avenue经过优化,可以快速工作,并使用C \ C ++(如果我错了,请纠正我)代码库,该代码库在IO方面固有地比大多数其他语言快。Python也非常快(同样快),只是在挂接到c库以执行操作(例如ArcPy或arcgisscripting)方面有开销。

因此,请首先尝试:
1.使用以下方法将需要使用的表复制到内存中-

  • gp.CopyFeatures(“要素类\ FeatureclassName的路径,”'in_memory'\ FeatureclassName“)-用于要素类和;
  • gp.CopyRow(“要素类\ FeatureTableName的路径,”'in_memory'\ FeatureTableName“)-用于“ in_memory”要素类或表中的表。

    这将允许您使用RAM磁盘等内存,并节省大量磁盘空间。您也可以在内存中创建要素类或表,方法是将FeatureDataset参数替换为'in_memory'。

尽可能使用python容器。这也将提高速度。

最后,提高读写ESRI格式信息的效率的顺序是

  1. Shapefile(悲伤但正确)
  2. 个人地理数据库
  3. 文件地理数据库
  4. ArcSDE(即使使用直接连接,速度也较慢)

尝试尝试这些建议,因为我正在尝试在gis.stackexchange.com上编译可在此处使用的事物的列表,请参见此处


内存选项似乎很有用,但是我要查询的表的组合可能几乎达到1 GB的时钟。我相信我有足够的RAM来实现这一点,但是表的庞大大小是否有发生严重崩溃的风险?另外,什么是python容器?
纳撒努斯2011年

令我惊讶的是,您将个人gdb的速度比文件gdb的速度快,因为这与我的经验直接相反。探索某个地方/时间会很有趣。
马特·威尔基2011年

这可能是我当前正在使用的过程,但是我发现文件gdb较慢,但仅此而已。我会说它们是同等的,并且纯粹出于文件限制,我会选择文件gdb而不是个人gdb。我对为此设计基准非常感兴趣。您有兴趣帮助我定义一些测试吗?
OptimizePrime

我尝试将shapefile放入内存,这似乎无济于事...实际上,脚本此后不久就停止了处理。
纳撒努斯2011年

3

我敢打赌,并不是大道比Python快,而是ArcView3比ArcGIS快(在您尝试做的事情中)。

因为从本质上讲,这实际上是一项非空间的练习,所以您可能需要尝试使用dbfpyodbc之类的东西直接访问数据库表(例如,不要使用arcpy)(我自己没有尝试过使用它们)。就个人而言,我发现命令行ogr2ogr的的GDAL / OGR套件是快几个数量级比在ArcGIS等价交易。不过,我只是略微研究了OGR查询功能,并且我没有仅使用python绑定来构建任何东西,因此我不知道该速度是否会持续下去。


这里唯一的麻烦是我将非空间数据附加到空间数据。IE浏览器我正在Shape与其他一些领域一起创建一个新记录,其中将包含几何图形和其他非空间数据。dpfpy和odbc会考虑Shapes运动场(及其几何形状)吗?
纳撒努斯2011年

它不适用于shapefile,因为Shape它不存储在.dbf中。从理论上讲,它可以使用odbc与个人地理数据库(.mdb)配合使用,但是我对这种方法持保留态度,尤其是因为OGR已经存在一种行之有效的途径,该途径已经知道shapefile和个人gdb。
马特·威尔基2011年

1

目前,这并不是一个特别有用的答案,但是请等待ArcGIS 10.1。在今年的esri开发者峰会上,我们被告知Arcpy 10.1游标支持已被完全重写,并且速度显着提高。在全体会议期间,有人声称速度提高了约8倍。


谢谢你的信息。如果没有别的,就值得期待。
纳撒努斯2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.