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


33

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

Mis preguntas especificas:

  • ¿Cuál es el uso y la sintaxis adecuados para usar el in_memoryespacio de trabajo en scripts basados ​​en ArcGIS / arcpy?
  • ¿Es el in_memoryespacio de trabajo lo mismo que, por ejemplo, crear una capa usando arcpy.MakeFeatureLayer_management()?
  • ¿Existen estándares como la eliminación del in_memoryespacio de trabajo al final del script?

Respuestas:


41

He estado usando "in_memory" bastante recientemente. Puede ser muy útil, ya que tiene el potencial de aumentar drásticamente las velocidades de procesamiento para ciertas tareas, sin embargo, si está trabajando con conjuntos de datos muy grandes, puede causar que su programa se bloquee.

Puede usar "in_memory" para definir los resultados del proceso ... a menudo, si estoy realizando una tarea en una clase de entidad, 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)

Tenga en cuenta que no tiene que concatenar memoryFeature juntos como lo hice, podría escribirlo como "in_memory \ myMemoryFeature", simplemente me gusta hacerlo de esa manera para alternar entre "in_memory" y un directorio físico fácilmente. Luego puede realizar procesos en su función en la memoria. Cuando haya terminado, puede revertir el proceso para guardarlo nuevamente en un directorio.

Podría estar equivocado, pero creo que no es lo mismo que crear una capa de entidades. las capas de entidades le dan acceso a métodos de selección y otras operaciones específicas de capa. Piense en el directorio "in_memory" como el vector equivalente al objeto ráster (raster = arcpy.Raster (myRasterLocation))

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

arcpy.Delete_management("in_memory")

Espero que ayude.


3
Estoy de acuerdo con @egdetti. Es muy útil, muy potente y acelera significativamente el procesamiento. Sin embargo, en realidad no es necesario eliminar el espacio de trabajo / capa, ya que se limpiará solo cuando cierre la aplicación. Sin embargo, como se mencionó, ejecutar arcpy.Delete puede ser útil (a veces necesario) si se está quedando sin RAM porque tiene demasiadas cosas en el espacio de trabajo in_memory.
RyanDalton

12

No hay mucho de eso. Hay un directorio mágico al que puede acceder en las herramientas de geoprocesamiento y los cursores de arco denominados in_memory. Haría algo como arcpy.management.CreateTable('in_memory', 'my_new_table')o CreateFeatureClasshacer una nueva tabla de características o tabla. Luego, tiene una nueva tabla en ese proceso con la ruta in_memory\my_new_table, si está en arcmap agregará una vista de tabla a la tabla de contenido nombrada my_new_tableque puede usar como acceso directo para llegar a ella. Si es una tabla temporal en la memoria, simplemente úsela arcpy.management.Delete(r'in_memory\my_new_table')cuando haya terminado con ella al final de su secuencia de comandos.


9

Ligeramente fuera de tema, pero creo que vale la pena señalarlo. En primer lugar, estoy de acuerdo con @JasonScheirer y @egdetti anteriores que in_memorypueden ser muy útiles. Lo más importante a tener en cuenta es que el in_memoryespacio de trabajo no admite datos ráster. Si esto se convierte en un problema, recomendaría usar el tempfilemódulo Python . Esto no será tan rápido, pero es más confiable. Por ejemplo, podrías 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
arcpy tiene una manera de lidiar con rásteres integrados con el método arcpy.Raster (). Al definir una variable como myRaster = arcpy.Raster ("C: \ RasteLocation"), crea un objeto ráster en la memoria que se puede usar en cálculos de álgebra de mapas y otras operaciones ráster fácilmente. Guardar tal objeto ráster es tan simple como escribir en myRaster.save ("C: \ SaveLocation"). Una característica muy útil que arcpy trae a la mesa.
bluefoot

@egdetti Feria de llamadas. Sin embargo, tengo curiosidad por saber cómo maneja conjuntos de datos más grandes.
om_henners

1
@mbenedetti: el objeto Ráster escribe un ráster en el espacio de trabajo de scratch de arcpy, lo más tarde posible, lo que permite a arcpy optimizar la E / S al apilar herramientas de procesamiento de celda única (como "+", por ejemplo) en un solo proceso de ejecución , por ejemplo. El método save () forzará la ejecución del procesamiento ráster.
Curtis Precio

3
¡@om_henners in_memory admite rásteres en ArcGIS 10.1!
Curtis Precio

2
@om_henners arcpy proporciona una herramienta para crear nombres reutilizables, lo que tiene ventajas porque, por ejemplo, una clase de entidad de reutilización en una carpeta tiene automáticamente ".shp" agregado. El método es arcpy.CreateScratchName ().
Curtis Precio
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.