随着arcpy中数据访问模块的引入(搜索游标的速度提高了30倍),我想知道计数符合sql标准的功能是否比传统的MakeTableView + GetCount方法更快?

评论

特征计数不仅仅是arcpy的属性有多愚蠢。描述对象

使用带有某些OGR SQL的ogrinfo,这非常容易。数据集有大约170000条记录,并且在未索引的VARCHAR字段上进行的通配符搜索仅在几秒钟后返回。 ogrinfo“ C:\ xGIS \ Vector \ parcels \ parcels_20140829_pmerc.ovf -sql”从parcels_20140829_pmerc中选择计数(*),例如'R39200-02-%'的tms“”

#1 楼

我已经从上面的答案中测试了解决方案,并且在我的实际数据上,差异可以忽略不计。与其他答案的结果相反,我在ArcMap中使用arcpy.MakeTableView_management和arcpy.da.SearchCursor的时间相同。

我已经测试了有无查询的变体,请查看查询版本的代码,以及最终的测量结果,如下:下方:

@staticmethod
def query_features(feature_class, query):

    # Method 1
    time.sleep(5)  # Let the cpu/ram calm before proceeding!
    start_time = time.clock()
    count = len(list(i for i in arcpy.da.SearchCursor(feature_class, ["OBJECTID"], query)))
    end_time = time.clock()
    arcpy.AddMessage("Method 1 finished in {} seconds".format((end_time - start_time)))
    arcpy.AddMessage("{} features".format(count))

    # Method 2
    time.sleep(5)  # Let the cpu/ram calm before proceeding!
    start_time = time.clock()
    arcpy.MakeTableView_management(feature_class, "myTableView", query)
    count = int(arcpy.GetCount_management("myTableView").getOutput(0))

    end_time = time.clock()
    arcpy.AddMessage("Method 2 in {} seconds".format((end_time - start_time)))
    arcpy.AddMessage("{} features".format(count))


评论


好了,距离回答问题已有7年了,所以我希望他们对他们的SDK进行了改进!!! =)感谢您自己测试Miro。

– Michael Markieta
19 Mar 5 '19在3:31

#2 楼

我正在使用一个示例,该示例在filegeodatabase中包含一百万个随机生成的点。

以下是一些使我们入门的代码:

 import time
import arcpy

arcpy.env.workspace = "C:\CountTest.gdb"

time.sleep(5) # Let the cpu/ram calm before proceeding!

"""Method 1"""
StartTime = time.clock()
with arcpy.da.SearchCursor("RandomPoints", ["OBJECTID"]) as cursor:
    rows = {row[0] for row in cursor}

count = 0
for row in rows:
    count += 1

EndTime = time.clock()
print "Finished in %s seconds" % (EndTime - StartTime)
print "%s features" % count

time.sleep(5) # Let the cpu/ram calm before proceeding!

"""Method 2"""
StartTime2 = time.clock()
arcpy.MakeTableView_management("RandomPoints", "myTableView")
count = int(arcpy.GetCount_management("myTableView").getOutput(0))

EndTime2 = time.clock()
print "Finished in %s seconds" % (EndTime2 - StartTime2)
print "%s features" % count
 


和一些初步的结果: SearchCursor将无限期爬网。

我对结果并不满意,但是,DataAccess模块​​已在我们的GIS开发圈中广泛使用。我正在尝试使用此模块重建一些函数定义,因为它比MakeTableView + GetCount方法更灵活。

评论


不错的综述。为了完整起见,我想添加IMO应该最快的方法,但实际上是最慢的方法(慢10倍)。 arcpy.Statistics_analysis(“ RandomPoints”,r“ in_memory \ count”,[[“ OBJECTID”,“ COUNT”]])光标= arcpy.da.SearchCursor(r“ in_memory \ count”,[“ COUNT_OBJECTID”])row = cursor.next()del光标计数=行[0]

– Berend
2015年6月11日14:57在