Jaka jest właściwa składnia i użycie dla obszaru roboczego ArcGIS „in_memory”?

33

Nie jestem pewien, jak najlepiej korzystać z in_memoryobszaru roboczego w ArcGIS. Najlepszym zasobem, jaki znalazłem na ten temat, jest ESRI na temat korzystania z przestrzeni roboczej w pamięci . Niestety sekcja pomocy nie jest bardzo pouczająca. Ponadto na tej stronie znajduje się post, który krótko porusza ten temat tutaj i tutaj .

Moje konkretne pytania:

  • Jakie jest właściwe użycie i składnia do używania in_memoryprzestrzeni roboczej w skryptach opartych na ArcGIS / arcpy?
  • Czy in_memoryobszar roboczy jest taki sam, jak na przykład tworzenie warstwy przy użyciu arcpy.MakeFeatureLayer_management()?
  • Czy istnieją jakieś standardy, takie jak usuwanie in_memoryobszaru roboczego na końcu skryptu?
Aaron
źródło

Odpowiedzi:

41

Ostatnio używałem „in_memory”. Może być bardzo przydatny, ponieważ może znacznie zwiększyć szybkość przetwarzania niektórych zadań, jednak jeśli pracujesz z bardzo dużymi zestawami danych, może to spowodować awarię programu.

Możesz użyć „in_memory” do zdefiniowania wyników procesu ... często, jeśli wykonuję zadanie na klasie elementów, najpierw skopiuję je do obszaru roboczego „in_memory”:

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

Zauważ, że nie musisz łączyć funkcji Memory razem, tak jak ja, możesz ją zapisać jako „in_memory \ myMemoryFeature”, po prostu lubię to robić w ten sposób, aby łatwo przełączać się między „in_memory” a katalogiem fizycznym. Następnie można wykonać procesy dotyczące funkcji w pamięci. Po zakończeniu możesz odwrócić proces, aby zapisać go z powrotem w katalogu.

Mogę się mylić, ale uważam, że to nie to samo, co tworzenie warstwy obiektów. warstwy obiektów dają dostęp do metod wyboru i innych operacji specyficznych dla warstwy. Traktuj katalog „in_memory” jako wektor równoważny obiektowi rastrowemu (raster = arcpy.Raster (myRasterLocation))

Aby wyczyścić po użyciu „in_memory”, wystarczy dodać następujący wiersz kodu:

arcpy.Delete_management("in_memory")

Mam nadzieję, że to pomaga.

bluefoot
źródło
3
Zgadzam się z @egdetti. Jest to bardzo przydatne, bardzo wydajne i znacznie przyspiesza przetwarzanie. W rzeczywistości nie trzeba jednak usuwać obszaru roboczego / warstwy, ponieważ wyczyści się on sam po zamknięciu aplikacji. Jak już wspomniano, uruchomienie arcpy.Delete może być pomocne (czasem konieczne), jeśli skończy Ci się pamięć RAM, ponieważ masz za dużo rzeczy w obszarze roboczym in_memory.
RyanDalton,
12

Nie ma w tym wiele. Istnieje magiczny katalog, do którego można uzyskać dostęp w narzędziach geoprzetwarzania i zwariowanych kursorach o nazwie in_memory. Zrobiłbyś coś takiego arcpy.management.CreateTable('in_memory', 'my_new_table')lub CreateFeatureClassstworzyłbyś nową klasę funkcji lub tabelę. Następnie masz nową tabelę w tym procesie ze ścieżką in_memory\my_new_table, jeśli jesteś w arcmap, doda widok tabeli do spisu treści o nazwie my_new_table, którego możesz użyć jako skrótu, aby się do niego dostać. Jeśli jest to tymczasowa tabela w pamięci, po prostu użyj, arcpy.management.Delete(r'in_memory\my_new_table')gdy skończysz z nią na końcu skryptu.

Jason Scheirer
źródło
9

Nie na temat, ale myślę, że warto na to zwrócić uwagę. Po pierwsze, zgadzam się zarówno z @JasonScheirer, jak i @egdetti powyżej, co in_memorymoże być bardzo przydatne. Najważniejszą rzeczą do odnotowania jest to, że in_memoryobszar roboczy nie obsługuje danych rastrowych. Jeśli stanie się to problemem, polecam za pomocą tempfilemodułu Python . To nie będzie tak szybkie, ale bardziej niezawodne. Na przykład możesz zrobić coś takiego:

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)
om_henners
źródło
2
arcpy ma sposób radzenia sobie z rastrami wbudowanymi w metodę arcpy.Raster (). Definiując zmienną taką jak myRaster = arcpy.Raster („C: \ RasteLocation”), tworzysz w pamięci obiekt rastrowy, który można łatwo wykorzystać do obliczeń algebry mapy i różnych innych operacji rastrowych. Zapisanie takiego obiektu rastrowego jest tak proste, jak zapisanie w myRaster.save („C: \ SaveLocation”). Bardzo pomocna funkcja, którą arcpy wprowadza na stół.
bluefoot
@egdetti Fair call. Ciekawe, jak radzi sobie z większymi zestawami danych.
om_henners,
1
@mbenedetti - obiekt Raster zapisuje raster w obszarze roboczym Arcpy Scratch - tak późno, jak to możliwe, co pozwala Arcpy na optymalizację I / O poprzez ułożenie narzędzi przetwarzania jednokomórkowego (np. „+”) w jednym procesie wykonywania , na przykład. Metoda save () wymusi wykonanie przetwarzania rastrowego.
Curtis Price
3
@om_henners in_memory obsługuje rastry w ArcGIS 10.1!
Curtis Cena
2
@om_henners arcpy zapewnia narzędzie do tworzenia nazw rysunków, co ma tę zaletę, że na przykład klasa funkcji rysowania w folderze automatycznie dodaje do niego „.shp”. Metodą jest arcpy.CreateScratchName ().
Curtis Price