Qualche tempo fa, ho scritto una rapida funzione Python per convertire una tabella di attributi in un dizionario python, in cui la chiave è presa da un campo ID univoco specificato dall'utente (in genere il campo OID). Inoltre, per impostazione predefinita tutti i campi vengono copiati nel dizionario, ma ho incluso un parametro che consente di specificare solo un sottoinsieme.
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
Funziona benissimo per set di dati relativamente piccoli, ma l'ho appena eseguito su una tabella contenente circa 750.000 righe e 15 campi - circa 100 MB in un geodatabase di file. Su questi, la funzione funziona molto più lentamente di quanto mi aspettassi: circa 5-6 minuti (e questo dopo aver copiato la tabella in_memory
nell'area di lavoro). Mi piacerebbe davvero trovare un modo per accelerare la conversione in dizionario o ottenere informazioni su una strategia migliore per la manipolazione di grandi quantità di dati di attributi utilizzando Python.
UpdateCursors non funzionerà bene per me, perché quando cambia una riga, ha il potenziale per innescare cambiamenti in molti altri. Effettuare il ciclo e processarli uno alla volta è troppo ingombrante per quello di cui ho bisogno.
subdict = {}
attraverso del subdict
produce un tempo di elaborazione di circa 10 secondi.
subdict[field] = row[cursor_fields.index(field)]
è più veloce di chiamare subdict[field] = row.getValue(field)
. In quest'ultimo scenario eseguiresti un passo ... anche se la differenza di prestazioni tra l'indicizzazione di due elenchi ( cursor_fields
e row
) e l'utilizzo di un singolo processo ESRI potrebbe non essere molto migliore e potrebbe anche peggiorare!