36 votos

¿Cuál es la sintaxis y el uso correcto del espacio de trabajo "in_memory" de ArcGIS?

No tengo claro cuál es la mejor manera de utilizar el in_memory espacio de trabajo en ArcGIS. El mejor recurso que he encontrado sobre el tema es el de ESRI en Uso del espacio de trabajo en memoria . Por desgracia, la sección de ayuda no es muy informativa. Además, hay un post en este sitio que toca brevemente el tema aquí y aquí .

Mis preguntas específicas:

  • ¿Cuál es el uso correcto y la sintaxis para utilizar in_memory espacio de trabajo en ¿Scripts basados en ArcGIS/arcpy?
  • Es in_memory espacio de trabajo lo mismo que, por ejemplo, crear una capa utilizando arcpy.MakeFeatureLayer_management() ?
  • ¿Existen normas como la eliminación de in_memory espacio de trabajo al final de el script?

44voto

Prachur Puntos 111

Últimamente he utilizado bastante "in_memory". Puede ser muy útil, ya que tiene el potencial de aumentar drásticamente la velocidad de procesamiento para ciertas tareas, sin embargo, si usted está trabajando con conjuntos de datos muy grandes, podría hacer que su programa se bloquee.

Puede utilizar "in_memory" para definir las salidas del proceso... a menudo, si estoy realizando una tarea en una clase de características, la copiaré primero en el espacio de trabajo "in_memory":

inFeature = r'C:\myDir.gdb\myFeature'
memoryFeature = "in_memory" + "\\" + "myMemoryFeature"
arcpy.CopyFeatures_management(inFeature, memoryFeature)

Ten en cuenta que no tienes que concatenar memoryFeature como hice yo, podrías escribirlo como "in_memory \myMemoryFeature ", simplemente me gusta hacerlo así para cambiar entre "in_memory" y un directorio físico fácilmente. Entonces puedes realizar procesos en tu función en memoria. Cuando haya terminado, puede invertir el proceso para guardarlo de nuevo en un directorio.

Podría estar equivocado, pero creo que no es lo mismo que crear una capa de características. Las capas de características te dan acceso a los métodos de selección y a otras operaciones específicas de las capas. Piensa en el directorio "in_memory" como el equivalente vectorial al objeto raster (raster = arcpy.Raster(myRasterLocation))

Para limpiar después de usar "in_memory" simplemente añada la siguiente línea de código:

arcpy.Delete_management("in_memory")

Espero que eso ayude.

3 votos

Estoy de acuerdo con @egdetti. Es muy útil, muy potente, y acelera significativamente el procesamiento. Sin embargo, no es necesario eliminar el espacio de trabajo/capa, ya que se limpiará por sí solo cuando se cierre la aplicación. Como se mencionó, sin embargo, la ejecución de la arcpy.Delete puede ser útil (a veces necesario) si usted se encuentra con la memoria RAM porque tiene demasiado en el espacio de trabajo en memoria.

12voto

Paul Puntos 555

No hay mucho que hacer. Hay un directorio mágico al que puedes acceder en las herramientas de geoprocesamiento y en los cursores de arcpy llamado in_memory . Harías algo como arcpy.management.CreateTable('in_memory', 'my_new_table') o CreateFeatureClass para hacer una nueva featureclass o tabla. Entonces tienes una nueva tabla en ese proceso con la ruta in_memory\my_new_table , si está en arcmap añadirá una vista de tabla al índice de contenidos llamada my_new_table que puedes usar como atajo para llegar a él. Si se trata de una tabla temporal en memoria, basta con utilizar arcpy.management.Delete(r'in_memory\my_new_table') cuando hayas terminado con él al final de tu script.

10voto

ESV Puntos 4591

Un poco fuera del tema, pero creo que vale la pena señalarlo. En primer lugar, estoy de acuerdo con @JasonScheirer y @egdetti en que in_memory puede ser muy útil. Lo más importante a tener en cuenta es que in_memory El espacio de trabajo no admite datos rasterizados. Si esto se convierte en un problema, le recomiendo que utilice el programa Python tempfile módulo. Esto no será tan rápido, pero es más fiable. Por ejemplo, usted podría hacer algo como:

import arcpy
import tempfile
import os.path
import shutil

try:
    temp_dir = tempfile.mkdtemp()
    temp_gdb = "temp.gdb"
    arcpy.CreateFileGDB_management(temp_dir, temp_gdb)
    arcpy.env.workspace = os.path.join(temp_dir, temp_gdb)

    #Some processing...

except Exception, e:
    #handle exceptions here
    print e
finally:
    shutil.rmtree(temp_dir, True)

2 votos

Arcpy tiene una forma de tratar con rásters incorporada con el método arcpy.Raster(). Definiendo una variable como myRaster = arcpy.Raster(" C:\RasteLocation ") se crea un objeto raster en la memoria que puede ser utilizado en los cálculos de álgebra de mapas y en otras operaciones raster fácilmente. Guardar dicho objeto raster es tan sencillo como escribir en miRaster.save(" C:\SaveLocation "). Una característica muy útil que arcpy pone sobre la mesa.

0 votos

@egdetti Es una buena idea. Sin embargo, tengo curiosidad por saber cómo maneja conjuntos de datos más grandes.

0 votos

@om_henners Gracias por introducirme en "tempfile".@egdetti otra buena sugerencia de usar myRaster=arcpy.Raster()--estoy deseando probarlo.

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