Coğrafi işlem hızı testleri için olağandışı sonuçlar


9

Bir Python geoprocessing script ile olağandışı bir performans gözlemliyorum. (Attached) betiği aşağıdaki eylemleri gerçekleştirir:

  1. Çokgen özelliklerine karşılık gelen UTM bölgesini aramak için bir arama imleci kullanın
  2. Arama imleci sonuçlarına dayalı olarak uzamsal referans nesnesi oluşturma
  3. .Csv dosyasını unsur katmanına ve sonra bir nokta unsur sınıfına dönüştürme

Betiğin nasıl çalıştığına bağlı olarak önemli ölçüde farklı işlem süreleri fark ettim:

  • IDLE = 203 saniye kullanarak 32 bit işleme
  • 32 bit işleme ön plan komut dosyası aracı = 91 saniye
  • 64 bit işleme arka plan komut dosyası aracı = 206 saniye

Bu komut dosyası yukarıdaki koşullar göz önüne alındığında neden bu kadar farklı çalışsın? Kesinlikle ön planda çalıştırmak 32-bit komut dosyası aracı diğer yöntemler kadar hızlı 2X beklemem.


import arcpy, os, time

###IDLE Parameters
##fc = r'C:\path\to\polygon\fc\with\utm\zones\and\features'
##outws = r'C:\out\location'
##arcpy.env.workspace = r'C:\workspace'

####################
## Script tool parameters
fc = arcpy.GetParameterAsText(0)    # Feature class
outws = arcpy.GetParameterAsText(1) # Folder
arcpy.env.workspace = arcpy.GetParameterAsText(2)   # Workspace
####################

# Tables are .csv
tables = arcpy.ListTables()

start = time.clock()

# Look up which UTM zone .csv features are in
for t in tables:
    quad = t[7:17]
    print quad
    whereClause = """ "QUADID" LIKE '%s' """ % quad
    with arcpy.da.SearchCursor(fc, ("QUADID","ZONE"), whereClause) as cursor:
        for row in cursor:
            if row[0] == quad:
                utmZone = row[1]
                if utmZone == 10:
                    sr = arcpy.SpatialReference(26910)  # NAD_1983_UTM_Zone_10N
                elif utmZone == 11:
                    sr = arcpy.SpatialReference(26911)  # NAD_1983_UTM_Zone_11N
                elif utmZone == 12:
                    sr = arcpy.SpatialReference(26912)  # NAD_1983_UTM_Zone_12N
                elif utmZone == 13:
                    sr = arcpy.SpatialReference(26913)   # NAD_1983_UTM_Zone_13N
                else:
                    print "The UTM Zone is outside 10-13"
            else:
                pass

    # Convert .csv to feature class
    try:
        outLayer = "in_memory"
        # Now with the sr defined, create the XY Event Layer
        arcpy.MakeXYEventLayer_management(t, "x", "y", outLayer, sr, "z")
        arcpy.FeatureClassToFeatureClass_conversion(outLayer, outws, t[7:17])
        arcpy.Delete_management("in_memory")
        end = time.clock()
        print "In_memory method finished in %s seconds" % (end - start)

    except:
        # Print any error messages
        print arcpy.GetMessages(2)

print "Processing complete"

1
Arcpy'yi tek başına almak ne kadar sürer? Mesajda bir biçimlendirme hatası var mı? Denemek gerekir: for döngüsü içinde mi?
Nathan W

2
Bence @ NathanW'ın ilk bakış açısı import arcpydikkate alınmaya değer çünkü zamanın üç testinizin IDLE ve 64bit rotaları için gerekli olduğu görülüyor, ancak yaklaşık iki dakika eklemek aşırı görünüyor. ArcPy'nin içe aktarılmasından daha fazlasını yapmayan bir araç çalıştırmayı deneyin.
PolyGeo

3
import arcpyÇizgi olduğunu söylemek oldukça güvenlidir . Arcpy'yi en son kullandığımda dışarıdan ithalat yavaştı. ArcGIS, dahili Python'a zaten içe aktarılmış olur, böylece içe aktarma zaten önbelleğe alınır.
Nathan W

3
@Nathan ve diğerleri kesinlikle doğrudur. IDLE veya komut satırı üzerinden bir işlemi çalıştırmak, 'arcpy arc' olarak adlandırdığınızda bir isabet alır. Bununla birlikte, gelişmiş performans sayesinde zamanı 'geri' alacağınız çok büyük süreçler için takas alabilirsiniz. ArcGIS'in başka bir ArcMap oturumu başlatması nedeniyle bir arka plan işlemi yürütmenin de bir zamanı vardır. Son olarak, denemenizde ortadan kaldırmanız gereken 32 ve 64 bit makineleriniz arasındaki donanım farkları nelerdir ve denemeniz sırasında başka hangi süreçler kaynak tüketiyordu vb.
MappaGnosis

2
+1 @JayLaura. Daha ileri gidebilir ve profil. [ General python doc] [ docs.python.org/2/library/profile.html] ve [ stackexchange posting] [ stackoverflow.com/questions/582336/… .
Roland

Yanıtlar:



6

Bir teorim var.

Sorunun, çıktınızın veya girdinizin doğrulanması olabileceğini düşünüyorum. GP aracı çalıştırmadan önce, arcpy parametreleri, örneğin, çıktı özelliği sınıfının zaten mevcut olup olmadığını doğrular.

ArcMap içinde, çalışma alanı (klasör) içeriğinin tümü önbelleğe alınır ve doğrulama, çalışma alanının kataloğunun "görünümüne" (bellekte - hızlı) göre yapılabilir. Bu, veri kümeleri, katalog görünümünü çalışma alanının (klasör) durumuyla eşitlemek için bir arcpy.RefreshCatalog () çalıştırılmasını gerektiren bir ArcGIS olmayan araç kullanılarak eklenirse karışıklığa neden olabilir.

Klasörünüz çok büyükse ve ArcGIS dışında çalışıyorsanız, arcpy, FeatureClassToFeatureClass çıktınızı doğrulamak için her seferinde bir klasör oluşturmak zorunda kalabilir. Klasörde çok fazla öğe varsa, bu gerçekten yavaşlayabilir.

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.