Hace un tiempo, escribí una rápida función de Python para la conversión de una tabla de atributos para un diccionario de python, donde la clave es tomado de un usuario especificado por el campo IDENTIFICADOR exclusivo (normalmente el OID de campo). Además, por defecto, todos los campos se copian en el diccionario, pero he incluido un parámetro que sólo permiten un subconjunto específico.
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
Esto funciona muy bien para los relativamente pequeños conjuntos de datos, pero sólo me encontré en una tabla que contiene alrededor de 750,000 filas y 15 campos -- alrededor de 100MB en una geodatabase de archivos. En estos, la función se ejecuta mucho más lento de lo que yo habría esperado: alrededor de 5 a 6 minutos (y esto es después de copiar la tabla a de la in_memory
de área de trabajo). Realmente me gustaría encontrar una manera de acelerar la conversión de diccionario, o de obtener alguna información sobre la mejor estrategia para la manipulación de grandes cantidades de datos de atributo usando Python.
UpdateCursors no funciona bien para mí, porque cuando uno de los cambios de fila, que tiene el potencial de desencadenar cambios en varios otros. Bucle a través de su tratamiento y transformación de una en una es demasiado engorroso para lo que yo necesito.