Beberapa waktu yang lalu, saya menulis fungsi Python cepat untuk mengonversi tabel atribut ke kamus python, di mana kuncinya diambil dari bidang ID unik khusus pengguna (biasanya bidang OID). Selain itu, secara default semua bidang disalin ke kamus, tetapi saya telah menyertakan parameter yang memungkinkan hanya subset ditentukan.
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
Ini berfungsi baik untuk dataset yang relatif kecil, tetapi saya hanya menjalankannya di atas meja yang berisi sekitar 750.000 baris dan 15 bidang - sekitar 100MB dalam file geodatabase. Pada ini, fungsi berjalan jauh lebih lambat daripada yang saya harapkan: sekitar 5-6 menit (dan ini setelah menyalin tabel ke in_memory
ruang kerja). Saya benar-benar ingin menemukan cara untuk mempercepat konversi ke kamus, atau mendapatkan beberapa wawasan tentang strategi yang lebih baik untuk memanipulasi sejumlah besar data atribut menggunakan Python.
UpdateCursors tidak akan berfungsi dengan baik untuk saya, karena ketika satu baris berubah, ia berpotensi memicu perubahan di beberapa baris lainnya. Melewati dan memprosesnya satu per satu terlalu rumit untuk apa yang saya butuhkan.
subdict = {}
melalui del subdict
menghasilkan waktu pemrosesan sekitar 10 detik.
subdict[field] = row[cursor_fields.index(field)]
lebih cepat daripada menelepon subdict[field] = row.getValue(field)
. Dalam skenario terakhir Anda akan melakukan satu langkah ... meskipun perbedaan kinerja antara pengindeksan dua daftar ( cursor_fields
dan row
) dan menggunakan proses ESRI tunggal mungkin tidak jauh lebih baik dan bahkan mungkin lebih buruk!