기능 클래스의 기능 수를 계산하는 가장 빠른 방법은 무엇입니까?


35

arcpy (30x 더 빠른 검색 커서)로 데이터 액세스 모듈을 도입하면 SQL 기준과 일치하는 계산 기능이 전통적인 MakeTableView + GetCount 방법보다 빠르는지 알고 싶습니다.


12
이 기능 수는 arcpy.Describe 객체의 단지 특성 아니라고 얼마나 바보
그랜트 험프리스

이것은 꽤 쉬운했다 ogrinfo 일부 OGR SQL . 데이터 세트에는 170000 개의 레코드가 있으며 색인화되지 않은 VARCHAR필드 에서이 와일드 카드 검색 은 몇 초 만에 다시 시작되었습니다. ogrinfo "C:\xGIS\Vector\parcels\parcels_20140829_pmerc.ovf -sql "SELECT count(*) FROM parcels_20140829_pmerc WHERE tms like 'R39200-02-%'"
elrobis

답변:


2

위의 답변 에서 솔루션을 테스트했으며 실제 데이터에서 그 차이는 무시할 수 있습니다. 다른 답변의 결과와는 달리, 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))

아래 결과 :

    No query:
    Method 1 finished in 5.3616442 seconds
    804140 features
    Method 2 in 4.2843138 seconds
    804140 features

    Many results query:
    Method 1 finished in 12.7124766 seconds
    518852 features
    Method 2 in 12.1396602 seconds
    518852 features

    Few results query:
    Method 1 finished in 11.1421476 seconds
    8 features
    Method 2 in 11.2232503 seconds
    8 features

글쎄, 질문에 대답 한 지 약 7 년이 지났으므로 SDK가 개선되기를 바랍니다. =) 직접 테스트 해 주셔서 감사합니다.
Michael Markieta

47

파일 지오 데이터베이스 내에서 무작위로 생성 된 백만 개의 포인트가있는 예제를 사용하고 있습니다. 여기에 첨부되어 있습니다 .

다음은 시작하는 데 필요한 코드입니다.

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

그리고 몇 가지 초기 결과 :

>>> 
Finished in 6.75540050237 seconds
1000000 features
Finished in 0.801474780332 seconds
1000000 features
>>> =============================== RESTART ===============================
>>> 
Finished in 6.56968596918 seconds
1000000 features
Finished in 0.812731769756 seconds
1000000 features
>>> =============================== RESTART ===============================
>>> 
Finished in 6.58207512487 seconds
1000000 features
Finished in 0.841122157314 seconds
1000000 features

더 크고 복잡한 데이터 세트를 상상해보십시오. SearchCursor는 무한정 크롤링됩니다.

결과에 전혀 만족하지는 않지만 DataAccess 모듈은 GIS 개발 분야에서 광범위하게 사용되고 있습니다. MakeTableView + GetCount 방법보다 더 유연하므로이 모듈을 사용하여 일부 함수 정의를 다시 작성하려고합니다.


좋은 검거. 완전성을 위해 IMO가 가장 빠른 것을 추가하고 싶지만 실제로 가장 느린 방법입니다 (10 배 느림). arcpy.Statistics_analysis("RandomPoints", r"in_memory\count", [["OBJECTID", "COUNT"]]) cursor = arcpy.da.SearchCursor(r"in_memory\count", ["COUNT_OBJECTID"]) row = cursor.next() del cursor count = row[0]
Berend
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.