4 votos

¿Por qué el proceso de fusión a través de ArcObjects es extremadamente lento?

En una de mis herramientas SIG basadas en arcobjects tengo un proceso que toma una matriz de rutas de shapefile y las utiliza como entradas con el ESRI.ArcGIS.DataManagement.Merge herramienta. Lo ejecuto a través de un Geoprocesador ejemplo. Utilizo esta configuración para otras tareas gp (como Get Count y Calculate Field), pero he descubierto que un proceso de fusión tarda mucho más en procesarse que si lo hubiera ejecutado en ArcMap o ArcCatalog. Por ejemplo, un proceso que he cronometrado en alrededor de 3 horas tomó más de 27 para completar cuando se realiza con este método en ArcObjects.

¿Alguien ha experimentado esto antes, y hay algún método conocido para acelerar el proceso?

EDITAR :
Para ser más explícito sobre el flujo de trabajo que tiene lugar aquí:

  1. Crea un objeto backgroundworker para hacer esto en un hilo separado para evitar el bloqueo de la UI.
  2. Enumerar las rutas de los archivos shape mediante Directory.GetFiles y añadirlas a una cadena de ruta delimitada por punto y coma para la operación de fusión
  3. Realice un recuento de cada Shapefile
  4. Utilice la cadena de ruta para realizar una operación de fusión.

He intentado usar IGeoProcessor y Geoprocessor para ver si hay algún aumento notable en el rendimiento, pero fue en vano. No hay bucles apretados involucrados (a menos que usted considere rápido Get Counts), y ciertamente no tengo ningún uso para un EditSession. Sin embargo, por alguna razón, el proceso avanza a un ritmo increíblemente lento.

Cabe señalar que estoy trabajando con conjuntos de datos excesivamente grandes (la red de carreteras de Norteamérica, por ejemplo), por lo que dudo que cualquier método que haga uso de la memoria RAM como espacio de trabajo sea adecuado.

2voto

Markus Olsson Puntos 12651

Puede intentar establecer un espacio de trabajo en memoria para reducir los tiempos de escritura de E/S, ya que esto puede estar ralentizando su proceso.

Vea un ejemplo del método SetEnvironmentValue() a continuación para utilizar un espacio de trabajo en memoria, suponiendo que ya lo haya configurado.

        Dim GP As New Geoprocessor
        Dim StreamLink As New StreamLink

        StreamLink.in_stream_raster = inStreamRaster
        StreamLink.in_flow_direction_raster = inFlowRaster
        StreamLink.out_raster = outRaster

        GP.SetEnvironmentValue("workspace", WorkspacePath)
        GP.TemporaryMapLayers = False
        GP.AddOutputsToMap = False
        GP.ClearMessages()

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