Veri erişim modülü ArcGIS sürüm 10.1 ile tanıtıldı. ESRI, veri erişim modülünü şu şekilde açıklar ( kaynak ):
Veri erişim modülü, arcpy.da, verilerle çalışmak için bir Python modülüdür. Düzenleme oturumunun, düzenleme işleminin, gelişmiş imleç desteğinin (daha hızlı performans dahil), tabloları ve özellik sınıflarını NumPy dizilerine ve NumPy dizilerinden dönüştürmeye yönelik işlevlere ve sürüm oluşturma, çoğaltma, etki alanları ve alt tür iş akışları desteğine izin verir.
Ancak, imleç performansının önceki nesil imleçlere göre neden bu kadar geliştiğine dair çok az bilgi var.
Ekteki şekil, yeni da
UpdateCursor yöntemiyle eski UpdateCursor yöntemine ilişkin bir karşılaştırma testinin sonuçlarını gösterir . Temel olarak, komut dosyası aşağıdaki iş akışını gerçekleştirir:
- Rastgele noktalar oluşturun (10, 100, 1000, 10000, 100000)
- Normal bir dağılımdan rastgele örnek alın ve imleçle rastgele noktalar özellik tablosundaki yeni bir sütuna değer ekleyin
- Hem yeni hem de eski UpdateCursor yöntemleri için her rastgele nokta senaryosunun 5 yinelemesini çalıştırın ve ortalama değeri listelere yazın
- Sonuçları çizin
da
İmleç performansını şekilde gösterilen dereceye yükseltmek için güncelleme imleci ile perde arkasında neler oluyor ?
import arcpy, os, numpy, time
arcpy.env.overwriteOutput = True
outws = r'C:\temp'
fc = os.path.join(outws, 'randomPoints.shp')
iterations = [10, 100, 1000, 10000, 100000]
old = []
new = []
meanOld = []
meanNew = []
for x in iterations:
arcpy.CreateRandomPoints_management(outws, 'randomPoints', '', '', x)
arcpy.AddField_management(fc, 'randFloat', 'FLOAT')
for y in range(5):
# Old method ArcGIS 10.0 and earlier
start = time.clock()
rows = arcpy.UpdateCursor(fc)
for row in rows:
# generate random float from normal distribution
s = float(numpy.random.normal(100, 10, 1))
row.randFloat = s
rows.updateRow(row)
del row, rows
end = time.clock()
total = end - start
old.append(total)
del start, end, total
# New method 10.1 and later
start = time.clock()
with arcpy.da.UpdateCursor(fc, ['randFloat']) as cursor:
for row in cursor:
# generate random float from normal distribution
s = float(numpy.random.normal(100, 10, 1))
row[0] = s
cursor.updateRow(row)
end = time.clock()
total = end - start
new.append(total)
del start, end, total
meanOld.append(round(numpy.mean(old),4))
meanNew.append(round(numpy.mean(new),4))
#######################
# plot the results
import matplotlib.pyplot as plt
plt.plot(iterations, meanNew, label = 'New (da)')
plt.plot(iterations, meanOld, label = 'Old')
plt.title('arcpy.da.UpdateCursor -vs- arcpy.UpdateCursor')
plt.xlabel('Random Points')
plt.ylabel('Time (minutes)')
plt.legend(loc = 2)
plt.show()