Qual è la sintassi e l'utilizzo corretti per l'area di lavoro ArcGIS "in_memory"?


33

Non sono chiaro il modo migliore di utilizzare l'area di in_memorylavoro in ArcGIS. La migliore risorsa che ho trovato sull'argomento proviene dall'ESRI sull'utilizzo dell'area di lavoro in memoria . Sfortunatamente, la sezione di aiuto non è molto istruttiva. Inoltre, c'è un post su questo sito che tocca brevemente l'argomento qui e qui .

Le mie domande specifiche:

  • Qual è l'uso e la sintassi corretti per l'utilizzo in_memorydell'area di lavoro negli script basati su ArcGIS / arcpy?
  • Lo in_memoryspazio di lavoro è uguale, ad esempio, alla creazione di un livello usando arcpy.MakeFeatureLayer_management()?
  • Esistono standard come l'eliminazione in_memorydell'area di lavoro alla fine dello script?

Risposte:


41

Ho usato "in_memory" un po 'di recente. Può essere molto utile, poiché ha il potenziale per aumentare notevolmente la velocità di elaborazione per determinate attività, tuttavia se si lavora con set di dati molto grandi, potrebbe causare l'arresto anomalo del programma.

È possibile utilizzare "in_memory" per definire gli output del processo ... spesso, se sto eseguendo un'attività su una classe di funzionalità, la copierò prima nello spazio di lavoro "in_memory":

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

Nota che non devi concatenare MemoryFeature insieme come ho fatto io, potresti scriverlo come "in_memory \ myMemoryFeature", mi piace farlo così per passare facilmente da "in_memory" a una directory fisica. È quindi possibile eseguire processi sulla funzionalità in memoria. Al termine, è possibile invertire il processo per salvarlo in una directory.

Potrei sbagliarmi, ma credo che non sia lo stesso della creazione di un feature layer. i feature layer offrono accesso ai metodi di selezione e ad altre operazioni specifiche dei layer. Pensa alla directory "in_memory" come il vettore equivalente all'oggetto raster (raster = arcpy.Raster (myRasterLocation))

Per ripulire dopo aver usato "in_memory" è sufficiente aggiungere la seguente riga di codice:

arcpy.Delete_management("in_memory")

Spero che sia d'aiuto.


3
Sono d'accordo con @egdetti. È molto utile, molto potente e velocizza notevolmente l'elaborazione. In realtà non è necessario eliminare l'area / livello di lavoro, poiché si pulirà da solo quando si chiude l'applicazione. Come accennato, tuttavia, eseguire arcpy.Delete può essere utile (a volte necessario) se ti trovi a corto di RAM perché hai troppe cose nell'area di lavoro in_memory.
Ryan Dalton,

12

Non c'è molto da dire. C'è una directory magica a cui puoi accedere negli strumenti di geoprocessing e nei cursori arcpy nominati in_memory. Faresti qualcosa di simile arcpy.management.CreateTable('in_memory', 'my_new_table')o CreateFeatureClassper creare una nuova featureclass o un tavolo. Quindi hai una nuova tabella in quel processo con il percorso in_memory\my_new_table, se sei in arcmap aggiungerà una vista tabella al sommario chiamato my_new_tableche puoi usare come scorciatoia per arrivarci. Se è una tabella di memoria temporanea, basta usare arcpy.management.Delete(r'in_memory\my_new_table')quando hai finito con esso alla fine dello script.


9

Un po 'fuori tema, ma penso che valga la pena sottolineare. In primo luogo sono d'accordo sia con @JasonScheirer sia con @egdetti che in_memorypossono essere molto utili. La cosa più importante da notare è che l'area di in_memorylavoro non supporta i dati raster. Se questo diventa un problema, consiglierei di utilizzare il tempfilemodulo Python . Questo non sarà così veloce, ma è più affidabile. Ad esempio, potresti fare qualcosa del tipo:

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 ha un modo di gestire i raster integrati con il metodo arcpy.Raster (). Definendo una variabile come myRaster = arcpy.Raster ("C: \ RasteLocation") si crea un oggetto raster in memoria che può essere facilmente utilizzato nei calcoli dell'algebra della mappa e in varie altre operazioni raster. Salvare un oggetto così raster è semplice come scrivere in myRaster.save ("C: \ SaveLocation"). Una funzionalità molto utile che arcpy porta sul tavolo.
bluefoot,

@egdetti Fair call. Sono curioso di sapere come gestisce set di dati più grandi però.
om_henners,

1
@mbenedetti - l'oggetto Raster scrive un raster nell'area di lavoro scratch arcpy - il più tardi possibile, il che consente ad arcpy di ottimizzare l'I / O impilando strumenti di elaborazione a cella singola (come "+" per esempio) in un singolo processo di esecuzione , per esempio. Il metodo save () forzerà l'esecuzione dell'elaborazione raster.
Curtis Price,

3
@om_henners in_memory supporta raster in ArcGIS 10.1!
Curtis Price,

2
@om_henners arcpy fornisce uno strumento per creare nomi scratch, il che presenta vantaggi in quanto ad esempio una classe di funzionalità scratch in una cartella ha automaticamente aggiunto ".shp". Il metodo è arcpy.CreateScratchName ().
Curtis Price,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.