5 votos

¿Es una mala idea convertir una tabla de geodatabase de archivos a un diccionario?

En primer lugar, ¿qué estoy tratando de hacer?

Estoy construyendo una secuencia de comandos de Python que debe ser llamado desde un ArcMap 10.0 cuadro de herramientas. Este secuencias de comandos utiliza (entre otros insumos) de los datos contenidos en la enorme gdb tablas. Procesa los datos de muchas maneras diferentes (por lo tanto, hay muchas inevitable iteraciones en la tabla).

Por qué iba yo a querer convertir los datos?

La razón por la que me estoy convirtiendo las tablas a ditionaries es que es muy lento para iterar a través de la tabla mediante SearchCursor. Tengo muchas operaciones que quiero hacer en mis datos y es mucho más sencillo y rápido para el uso de estructuras de datos existentes.

¿Cómo lo estoy haciendo?

La forma habitual de utilizar gdb tablas en Python (y a la que los he comparado mi método) es algo a lo largo de las líneas de:

# Create a search cursor
rows = arcpy.SearchCursor(table)
for row in rows:
    (...)

Lo que yo estoy haciendo en lugar de eso, es que yo soy de convertir la tabla a dbf usando TableToTable_conversion (tirar algunas inútil columnas/filas en el camino). Entonces puedo convertir esta tabla DBF a un diccionario (me fue inspirado por un código, escrito por Tyrtamos, si buscas en google "Conferencia d'un archivo de dbase III" usted debe encontrar). En fin, tengo un diccionario que contiene las listas de datos indexados con los nombres de columna. Y estoy muy feliz porque puedo hacer muchas cosas con ella de forma relativamente rápida.

Por último,...

Este método parece ser mucho más rápido. Sin embargo, soy nuevo en el juego y tengo miedo de estar perdiendo algo porque no entiendo todo lo que está pasando. Es una mala idea para hacer eso? ¿Hay razones para no hacerlo distinto potencial desbordamiento de memoria?

Por favor, dime si algo no está claro. Gracias!

EDITAR

Después de ver tus respuestas, me doy cuenta de que no era uno muy importante la información que falta: estoy usando Arcmap 10.0.

Tengo ejecutar pruebas de rendimiento utilizando nmpeterson de la solución, la modificación de un par de líneas para hacer que el código sea compatible con ArcGIS 10.0

cursor = arcpy.SearchCursor(fc, cursor_fields)
for row in cursor:
    rowList = []
    for field in cursor_fields:
        rowList.append(row.getValue(field))
    attr_dict[rowList[0]] = dict(zip(cursor_fields, rowList))

En una pequeña tabla que contiene ~15000 filas, me midió un promedio de tiempo transcurrido y consiguió

make_attribute_dict -- 10.7378981873
gdb_to_dbf_to_dict-- 2.56576526461

8voto

Jon M Puntos 206

Aquí hay una función que escribí para hacer una conversión directamente desde cualquier clase de entidad (o tabla) a un diccionario con un arcpy.da.SearchCursor :

 def make_attribute_dict(fc, key_field, attr_list=['*']):
    ''' Create a dictionary of feature class/table attributes.
        Default of ['*'] for attr_list (instead of actual attribute names)
        will create a dictionary of all attributes. '''
    attr_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]
    # Ensure that key_field is always the first field in the field list
    cursor_fields = [key_field] + list(set(valid_fields) - set([key_field]))
    with arcpy.da.SearchCursor(fc, cursor_fields) as cursor:
        for row in cursor:
            attr_dict[row[0]] = dict(zip(cursor.fields, row))
    return attr_dict
 

En el diccionario resultante (llámelo attr_dict ), el valor de un campo específico para una fila específica (por ejemplo, 'OBJECTID' = 5 cuando se especificó 'OBJECTID' como key_field ) se puede acceder con attr_dict[5]['FIELD_NAME'] .

3voto

Ron Warholic Puntos 7479

Probablemente no es una respuesta completa, ya que no voy a pretender ser un absoluto experto en la materia, pero algunas cosas para pensar:

No sé qué versión de ArcGIS está utilizando, así que no sé si esto sería aplicable o no (no disponible en algunas de las versiones anteriores), pero, si está disponible, pruebe el arcpy.da.searchcursor (http://resources.arcgis.com/en/help/main/10.1/index.html#//018w00000011000000) como mi experiencia me ha dicho que hay IMPORTANTES diferencias de rendimiento entre el viejo .searchcursor y el nuevo .da.searchcursor

Cuando la conversión de un GDB tabla DBF de la tabla, a menos que el diseño de base de datos se hace muy cuidadosamente con esto en mente, es probable que tenga los nombres de campo que conseguir truncado debido a DBF tener máx nombre del campo longitud. También, es probable que terminan con algunos posibles resultados inesperados, si no tienes cuidado, si usted tiene los sub-tipos y/o dominios en el uso de su fuente de datos, ya que, dependiendo de su configuración, es posible exportar el valor codificado, el valor de descripción, o ambos.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X