Bir özellik sınıfındaki özelliklerin sayısını saymanın en hızlı yolu?


35

Arcpy'de Veri Erişimi modülünün tanıtımıyla (30x daha hızlı arama imleçleri), sql ölçütleriyle eşleşen özelliklerin sayımının geleneksel MakeTableView + GetCount metodolojisinden daha hızlı olup olmadığını bilmek istiyorum.


12
Özellik sayısının sadece bir arcpy'nin özelliği olmadığı ne kadar aptalca. Tarif nesnesi
Grant Humphries

Bazı OGR SQL ile ogrinfo ile bu oldukça kolaydı . Veri kümesinde 170000 kayıt gibi bir şey var ve altı çizili bir alanda bu joker karakter araması birkaç saniye içinde geri döndü. VARCHARogrinfo "C:\xGIS\Vector\parcels\parcels_20140829_pmerc.ovf -sql "SELECT count(*) FROM parcels_20140829_pmerc WHERE tms like 'R39200-02-%'"
elrobis

Yanıtlar:


2

Yukarıdaki cevaptan gelen çözümü test ettim ve gerçek dünya verilerimde fark önemsiz. Diğer cevaplarla sonuçlanmanın tersine, arcpy.MakeTableView_management ve ArcMap içindeki arcpy.da.SearchCursor için zamanlarım aynı.

Sorgu olan ve olmayan varyasyonları test ettim, lütfen sorgu sürümünün koduna ve aşağıdaki son ölçülen sonuçlara bakın:

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

Aşağıdaki sonuçlar:

    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

Sorunun yanıtlanmasından bu yana yaklaşık 7 yıl geçti, bu yüzden SDK'larında iyileştirmeler yaptıklarını umuyorum !!! =) Kendiniz test ettiğiniz için teşekkürler Miro.
Michael Markieta

47

Bir filegeotabase'in içinde 1 milyon rastgele oluşturulmuş nokta içeren bir örnek kullanıyorum. Buraya ekli .

İşte bize başlamak için bazı kod:

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

Ve bazı ilk sonuçlar:

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

Daha büyük, daha karmaşık veri kümelerini düşünün. SearchCursor süresiz olarak tarar.

Sonuçlardan hiç memnun değilim, ancak DataAccess modülü GIS geliştirme çevremizde yoğun bir şekilde kullanılıyor. MakeTableView + GetCount metodolojisinden daha esnek olduğundan, bu modülle bazı fonksiyon tanımlarımızı yeniden inşa etmek istiyorum.


Güzel bir toparlama. Bütünlük uğruna IMO’nun en hızlı olması gerektiğini eklemek isterdim, ama aslında en yavaş yöntem (10 kat daha yavaş). 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.