8 votos

Cómo eliminar la clase de entidad de las características más rápida (ArcPy)

He escrito este script que se reproduce a través de todas las clases de entidad en un conjunto dado de la función de los conjuntos de datos y elimina todas sus características. Él aparece para hacer el trabajo, pero se ejecuta muy lentamente. Hay algo que estoy haciendo mal aquí o hay alguna manera obvia para acelerar las cosas?

Estoy usando DeleteFeatures_management para hacer la escritura. DeleteRows_management también parece funcionar.

import sys
import os
import arcpy
from arcpy import env
import datetime
import getpass

try:
    passwd = getpass.getpass("Enter the sde user password: ")

    sdeConnectionFileDir = os.environ.get("TEMP")
    databaseName = ""
    fileName = "temp.sde"

    # Delete any pre-existing SDE connection file.
    fullPath = sdeConnectionFileDir + '\\' + fileName
    if os.path.exists(fullPath):
        os.remove(fullPath)

    # Create temporary SDE connection file.
    arcpy.CreateArcSDEConnectionFile_management (
        sdeConnectionFileDir, fileName,
        "sdeserver", "5151", "",
        "DATABASE_AUTH", "my_sde_user", passwd,
        "SAVE_USERNAME", "SDE.DEFAULT", "SAVE_VERSION"
    )

    env.workspace = fullPath

    # ArcPy status codes.
    returnCodes = {'WARN' : 0, 'INFO' : 1, 'ERROR' : 2}

    featureDatasets = []
    featureDatasets.extend(arcpy.ListDatasets("dataset1*"))
    featureDatasets.extend(arcpy.ListDatasets("dataset2*"))
    featureDatasets.extend(arcpy.ListDatasets("dataset3*"))

    list = '[%s]' % ', '.join(map(str, featureDatasets))
    response = raw_input("\n***** WARNING!!! ***** \nAll data will be deleted from all feature classess in the following datasets: \n\n" + list + "\n\n |--> Type DELETE to begin removal: ")
    if response == "DELETE":
        print "\nStarted: " + str(datetime.datetime.now()) + "\n"
        for dataset in featureDatasets:
            print "Processing dataset: " + dataset
            for fc in arcpy.ListFeatureClasses("*", "ALL", dataset):
                rowCount = int(arcpy.GetCount_management(fc).getOutput(0))

                if rowCount > 0:
                    print "  -- Processing feature class: " + str(fc) + " (" + str(rowCount) + " rows)"
                    #arcpy.DeleteRows_management(fc)
                    arcpy.DeleteFeatures_management(fc)

        print "\nCompleted: " + str(datetime.datetime.now())

except Exception as e:
    if arcpy:
        arcpyErrors = arcpy.gp.getMessages(returnCodes['ERROR'])
        if arcpyErrors:
            sys.stderr.write(arcpyErrors + "\n")
    sys.stderr.write(str(e) + "\n")
    sys.exit(1)

EDITAR --

Os pongo algunas de rendimiento de temporizadores en el script y he aquí los datos:

  • El tiempo para recuperar conjuntos de datos: 0:00:01.254000
  • Total De Clases De Entidad: 1682
  • Total de Clases de entidad con los Datos: 124
  • Total De Funciones De Procesado: 190222
  • Tiempo Total: 3 horas, 16 minutos

El desglose:

Característica del conjunto de datos --> lista de clase de entidad de llamadas:

* AVG   0:00:02
* MIN   0:00:01
* MAX   0:00:07
* COUNT 40
* TOTAL 0:01:08

Función de conteo de llamadas (la mayoría del tiempo):

* AVG   0:00:06
* MIN   0:00:01
* MAX   0:00:16
* COUNT 1682
* TOTAL 2:41:00

Función de eliminación de llamadas (reducido debido a que sólo las clases de entidad con filas se procesan):

* AVG   0:00:17
* MIN   0:00:02
* MAX   0:03:22
* COUNT 124
* TOTAL 0:34:31

14voto

auramo Puntos 161

Qué parte de la secuencia de comandos que realmente está tomando la mayor parte del tiempo? Hay cerca de 5 otros pasos pasando antes de empezar a borrar cosas.

Usted podría querer romper la secuencia de comandos de abajo en pedazos del tamaño de pruebas. Por ejemplo, en lugar de crear una conexión temporal de archivos, la inclusión de un montón de conjuntos de datos, listado de su contenido, contando sus registros, y, finalmente, haciendo lo que quieres hacer (eliminación de características), acaba de pasar en una única clase de entidad con una premade archivo de conexión a DeleteFeatures y ver cuánto tiempo tarda.

Si que funciona aceptablemente, a continuación, crear otra prueba para el tiempo de la posibilidad de un potencial foco de problemas: el recuento de filas. Y otro para la inclusión de las clases de entidad dentro de un dataset de entidades, y, sin embargo, otro para la lista de la característica de los conjuntos de datos dentro de una geodatabase.

Si, por otro lado, DeleteFeatures no realiza aceptablemente, a continuación, al menos sabemos dónde está el problema. En ese caso yo estaría más inclinado a mirar cómo la geodatabase está diseñado:

  • Alguna de su característica de los conjuntos de datos versionados? Cuando se utiliza el control de versiones existe un par adicional de Un (añade) y D (elimina) las tablas para cada una de las versiones de la tabla, y al eliminar funciones que no son la eliminación de registros en la base de la tabla, agregar registros a la mesa. Esto va a tomar mucho más tiempo que si no fue versionada.

  • Desde sus clases de entidad de que todos parecen estar en función de los conjuntos de datos, participan en el comportamiento de la geodatabase como una topología o la red geométrica? Al agregar/quitar/modificar las características de la participación en el comportamiento de la geodatabase hay mucho más gastos.

  • Tenga en cuenta también que, contrariamente a la creencia popular, característica de los conjuntos de datos no están diseñados para ser utilizados como una herramienta de organización:

    Característica de los conjuntos de datos existentes en la geodatabase para definir un ámbito para una referencia espacial. Todas las clases de entidad que participan en topológico relaciones con el otro (por ejemplo, un la red geométrica) debe tener la misma referencia espacial. Característica de los conjuntos de datos son una forma de agrupar las clases de entidad con la misma referencia espacial para que puedan participar en topológica de las relaciones con los demás.

    Para la mayoría de los usuarios, característica de los conjuntos de datos también tienen un natural de organización de la calidad, como una carpeta en un sistema de archivos. Ya que para muchas de las aplicaciones SIG en la mayoría de los datos tiene la misma referencia espacial, la tentación de grupo de un gran número de clases de entidad en función de conjuntos de datos es irresistible.

    Característica de los conjuntos de datos, sin embargo, no son libres. Cuando se abre una característica de la clase contenida en una función de un conjunto de datos para buscar en sus propiedades o dibujar o consulta en ArcCatalog™, ArcMap™, o una aplicación personalizada, todas las otras clases de entidad en que la característica de conjunto de datos son abiertos. Esto se hace debido a que las actualizaciones a una clase de entidad en una característica del conjunto de datos puede potencialmente dominó a otras clases de entidad en el conjunto de datos que participan en relaciones topológicas.

    De: Multiusuario Sistemas de Información Geográfica con ArcInfo 8 (abril de 2000)

    Lo que podría ser otra fuente de sobrecarga, incluso si ellos no participan en una topología o la red geométrica.

Más allá de la arcpy DeleteFeatures/DeleteRows comandos:

  • Si usted tiene SDE comando de administración de acceso puede utilizar:

    sdetable -o truncate -t <tablename>

    Este truncar la tabla de comandos que el DBMS por lo que debe ser mucho más rápido, pero tenga en cuenta que esto ignora el comportamiento de la geodatabase.

  • El uso de ArcSDESQLExecute para emitir TRUNCATE TABLE comandos directamente (de nuevo, evitando el comportamiento de la geodatabase), pero esto es muy de problemas propensos que se necesita para emitir una para cada tabla que hace de una clase de entidad (base, F, S, I, a, D, etc.) No hacer esto con cuidado y correctamente, puede dejar sus datos en un estado inconsistente.

9voto

UnkwnTech Puntos 21942

Si la actualización a ArcGIS 10.1 (ahora en libertad) es una opción, a continuación, acabo de encontrar esto en las novedades en ArcGIS 10.1 PDF:

Nueva herramienta para eliminar todas las filas de una tabla

La herramienta de geoprocesamiento TruncateTable en el conjunto de herramientas Tablas se pueden utilizar para eliminar todas las filas de una tabla o clase de entidad. Usted debe utilizar el Truncate Table herramienta en lugar de la eliminación de Filas de la herramienta cuando desee eliminar todas las filas de una tabla o clase de entidad.

Su ayuda en línea se puede encontrar aquí.

5voto

Jon M Puntos 206

¿Por qué no eliminar la característica de los conjuntos de datos propios con arcpy.DeleteFeatures_management(dataset)? Si usted todavía necesita el dataset de entidades de existir, simplemente puede volver a crear después de que se ha eliminado.

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