Was ist die richtige Syntax und Verwendung für den ArcGIS-Arbeitsbereich "in_memory"?


33

Ich bin nicht sicher, wie ich den in_memoryArbeitsbereich in ArcGIS am besten nutzen soll . Die beste Ressource, die ich zu diesem Thema gefunden habe, ist ESRI über die Verwendung des Arbeitsbereichs im Arbeitsspeicher . Leider ist der Hilfebereich nicht sehr informativ. Außerdem gibt es auf dieser Site einen Beitrag, der das Thema hier und hier kurz anspricht .

Meine spezifischen Fragen:

  • Was ist die richtige Verwendung und Syntax für die Verwendung von in_memoryWorkspace in ArcGIS / arcpy-basierten Skripten?
  • Ist in_memoryArbeitsplatz die gleichen wie zum Beispiel die Schaffung einer Schicht unter Verwendung arcpy.MakeFeatureLayer_management()?
  • Gibt es Standards wie das Löschen des in_memoryArbeitsbereichs am Ende des Skripts?

Antworten:


41

Ich habe "in_memory" in letzter Zeit ziemlich oft benutzt. Es kann sehr nützlich sein, da es die Verarbeitungsgeschwindigkeit für bestimmte Aufgaben dramatisch erhöhen kann. Wenn Sie jedoch mit sehr großen Datenmengen arbeiten, kann dies zum Absturz Ihres Programms führen.

Sie können "in_memory" verwenden, um Prozessausgaben zu definieren. Wenn ich eine Aufgabe für eine Feature-Class durchführe, kopiere ich sie häufig zuerst in den Arbeitsbereich "in_memory":

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

Beachten Sie, dass Sie memoryFeature nicht wie ich zusammenfügen müssen, sondern als "in_memory \ myMemoryFeature" ausgeben können. Ich mache es einfach gerne so, dass Sie leicht zwischen "in_memory" und einem physischen Verzeichnis hin und her wechseln können. Sie können dann Prozesse für Ihre Funktion im Speicher ausführen. Wenn Sie fertig sind, können Sie den Vorgang umkehren, um ihn wieder in einem Verzeichnis zu speichern.

Ich könnte mich irren, aber ich glaube, es ist nicht dasselbe wie das Erstellen eines Feature-Layers. Feature-Layer bieten Zugriff auf Auswahlmethoden und andere schichtspezifische Vorgänge. Stellen Sie sich das Verzeichnis "in_memory" als den Vektor vor, der dem Rasterobjekt entspricht (raster = arcpy.Raster (myRasterLocation))

Um nach der Verwendung von "in_memory" aufzuräumen, fügen Sie einfach die folgende Codezeile hinzu:

arcpy.Delete_management("in_memory")

Hoffentlich hilft das.


3
Ich stimme @egdetti zu. Es ist sehr nützlich, sehr leistungsfähig und beschleunigt die Verarbeitung erheblich. Sie müssen den Arbeitsbereich / die Ebene jedoch nicht wirklich löschen, da diese beim Schließen der Anwendung automatisch bereinigt wird. Wie bereits erwähnt, kann das Ausführen von arcpy.Delete hilfreich sein (manchmal erforderlich), wenn Sie feststellen, dass Ihnen der Arbeitsspeicher ausgeht, weil Sie zu viel Material im Arbeitsbereich in_memory haben.
RyanDalton

12

Da ist nicht viel dran. Es gibt ein magisches Verzeichnis, auf das Sie mit Geoverarbeitungswerkzeugen und Arcpy-Cursorn zugreifen können in_memory. Sie würden so etwas tun arcpy.management.CreateTable('in_memory', 'my_new_table')oder CreateFeatureClasseine neue Feature-Class oder Tabelle erstellen. Dann haben Sie in diesem Prozess eine neue Tabelle mit dem Pfad in_memory\my_new_table. Wenn Sie sich in arcmap befinden, wird dem Inhaltsverzeichnis eine Tabellenansicht hinzugefügt my_new_table, die Sie als Verknüpfung verwenden können, um dorthin zu gelangen. Wenn es sich um eine temporäre Tabelle im Speicher handelt, verwenden arcpy.management.Delete(r'in_memory\my_new_table')Sie sie am Ende Ihres Skripts.


9

Etwas abseits des Themas, aber ich denke es lohnt sich darauf hinzuweisen. Erstens stimme ich sowohl @JasonScheirer als auch @egdetti zu, in_memorywas sehr nützlich sein kann. Das Wichtigste ist, dass der in_memoryArbeitsbereich keine Rasterdaten unterstützt. Wenn dies zu einem Problem wird, empfehle ich die Verwendung des Python- tempfileModuls. Dies ist nicht so schnell, aber zuverlässiger. Sie könnten beispielsweise Folgendes tun:

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 kann mit Rastern umgehen, die mit der Methode arcpy.Raster () erstellt wurden. Indem Sie eine Variable wie myRaster = arcpy.Raster ("C: \ RasteLocation") definieren, erstellen Sie ein Rasterobjekt im Speicher, das problemlos für Kartenalgebra-Berechnungen und verschiedene andere Rasteroperationen verwendet werden kann. Das Speichern eines solchen Rasterobjekts ist so einfach wie das Schreiben in myRaster.save ("C: \ SaveLocation"). Eine sehr hilfreiche Funktion, die arcpy auf den Tisch bringt.
Bluefoot

@egdetti Fairer Anruf. Ich bin gespannt, wie es mit größeren Datensätzen umgeht.
Om_henners

1
@mbenedetti - Das Raster-Objekt schreibt so spät wie möglich ein Raster in den Arcpy-Scratch-Arbeitsbereich, wodurch Arcpy die E / A-Optimierung durch Stapeln von Single-Cell-Processing-Tools (z. B. "+") in einem einzigen Ausführungsprozess durchführen kann , beispielsweise. Die save () -Methode erzwingt die Ausführung der Rasterverarbeitung.
Curtis Price

3
@om_henners in_memory unterstützt Raster in ArcGIS 10.1!
Curtis Price

2
@om_henners arcpy bietet ein Tool zum Erstellen von Scratch-Namen. Dies hat den Vorteil, dass beispielsweise einer Scratch-Feature-Class in einem Ordner automatisch ".shp" hinzugefügt wird. Die Methode ist arcpy.CreateScratchName ().
Curtis Price
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.