Cara tercepat untuk menghitung jumlah fitur dalam kelas fitur?

35

Dengan diperkenalkannya modul Akses Data di arcpy (kursor pencarian 30x lebih cepat), saya ingin tahu apakah penghitungan fitur yang cocok dengan kriteria sql lebih cepat daripada metodologi MakeTableView + GetCount tradisional?

Michael Markieta
sumber
12
Betapa bodohnya bahwa jumlah fitur bukan hanya properti dari busur. Objek deskripsi
Grant Humphries
Ini cukup mudah dengan ogrinfo dengan beberapa OGR SQL . Dataset memiliki sekitar 170000 catatan, dan pencarian wildcard ini pada VARCHARbidang yang tidak diindeks kembali hanya dalam beberapa detik. ogrinfo "C:\xGIS\Vector\parcels\parcels_20140829_pmerc.ovf -sql "SELECT count(*) FROM parcels_20140829_pmerc WHERE tms like 'R39200-02-%'"
elrobis

Jawaban:

2

Saya telah menguji solusi dari jawaban di atas dan pada data dunia nyata saya perbedaannya dapat diabaikan. Berlawanan dengan hasil dalam jawaban lain, waktu saya untuk arcpy.MakeTableView_management dan arcpy.da.SearchCursor dalam ArcMap adalah sama.

Saya telah menguji variasi dengan dan tanpa kueri, silakan lihat kode untuk versi kueri, dan hasil akhir yang diukur di bawah:

@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))

Hasil di bawah ini:

    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
Miro
sumber
Yah, sudah sekitar 7 tahun sejak pertanyaan itu dijawab jadi saya berharap mereka telah melakukan perbaikan pada SDK mereka !!! =) terima kasih telah mengujinya sendiri Miro.
Michael Markieta
47

Saya menggunakan contoh dengan 1 juta poin yang dihasilkan secara acak di dalam sebuah filegeodatabase. Terlampir di sini .

Berikut ini beberapa kode untuk memulai:

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

Dan beberapa hasil awal:

>>> 
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

Bayangkan kumpulan data yang lebih besar dan lebih kompleks. SearchCursor akan merayap tanpa batas.

Saya sama sekali tidak puas dengan hasilnya, namun, modul DataAccess sedang digunakan secara luas di lingkaran pengembangan GIS kami. Saya ingin membangun kembali beberapa definisi fungsi kami dengan modul ini karena modul ini lebih fleksibel daripada metodologi MakeTableView + GetCount.

Michael Markieta
sumber
Roundup yang bagus. Demi kelengkapan saya ingin menambahkan IMO apa yang harus tercepat, tetapi sebenarnya metode paling lambat (10x lebih lambat). 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