Bir süre önce, bir öznitelik tablosunu python sözlüğüne dönüştürmek için hızlı bir Python işlevi yazdım, burada anahtar kullanıcı tarafından belirtilen benzersiz bir kimlik alanından (genellikle OID alanı) alınır. Ayrıca, varsayılan olarak tüm alanlar sözlüğe kopyalanır, ancak yalnızca bir alt kümenin belirtilmesine izin veren bir parametre ekledim.
def make_attribute_dict(fc, key_field, attr_list=['*']):
dict = {}
fc_field_objects = arcpy.ListFields(fc)
fc_fields = [field.name for field in fc_field_objects if field.type != 'Geometry']
if attr_list == ['*']:
valid_fields = fc_fields
else:
valid_fields = [field for field in attr_list if field in fc_fields]
if key_field not in valid_fields:
cursor_fields = valid_fields + [key_field]
else:
cursor_fields = valid_fields
with arcpy.da.SearchCursor(fc, cursor_fields) as cursor:
for row in cursor:
key = row[cursor_fields.index(key_field)]
subdict = {}
for field in valid_fields:
subdict[field] = row[cursor_fields.index(field)]
dict[key] = subdict
del subdict
return dict
Bu nispeten küçük veri kümeleri için harika çalışıyor, ancak sadece yaklaşık 750.000 satır ve 15 alan içeren bir tabloda çalıştırdım - bir dosya coğrafi veritabanında yaklaşık 100 MB. Bunlarda, işlev beklediğimden çok daha yavaş çalışır: yaklaşık 5-6 dakika (ve bu tabloyu in_memory
çalışma alanına kopyaladıktan sonra ). Sözlüğe dönüşümü hızlandırmanın bir yolunu bulmak veya Python kullanarak büyük miktarda özellik verilerini işlemek için daha iyi bir strateji hakkında biraz bilgi edinmek istiyorum.
UpdateCursors benim için iyi çalışmaz, çünkü bir satır değiştiğinde, diğerlerinde değişiklikleri tetikleme potansiyeline sahiptir. Bir kerede bir döngü yapmak ve işlemek ihtiyacım olan şey için çok hantal.
subdict = {}
sona yorumlamak del subdict
yaklaşık 10 saniyelik bir işlem süresi sağlar.
subdict[field] = row[cursor_fields.index(field)]
daha hızlı olup olmadığına bakmaktır subdict[field] = row.getValue(field)
. İkinci senaryoda, bir adım gerçekleştiriyor olacaksınız ... ancak iki listeyi indeksleme ( cursor_fields
ve row
) ve tek bir ESRI işlemi kullanma arasındaki performans farkı çok daha iyi olmayabilir ve daha da kötü olabilir!