ArcGIS“in_memory”작업 공간의 올바른 구문과 사용법은 무엇입니까?


33

in_memoryArcGIS 에서 작업 공간을 가장 잘 사용하는 방법이 확실하지 않습니다 . 내가 주제에서 찾은 최고의 리소스는 메모리 내 작업 공간 사용에 대한 ESRI입니다 . 불행히도 도움말 섹션은 그다지 유익하지 않습니다. 또한이 사이트에는 여기 및 여기 의 주제를 간략하게 다루는 게시물이 있습니다 .

내 구체적인 질문 :

  • in_memoryArcGIS / arcpy 기반 스크립트에서 작업 공간 을 사용하기위한 올바른 사용법과 구문은 무엇입니까 ?
  • 가 in_memory작업 공간 사용하여 레이어를 생성, 예를 들어, 같은 arcpy.MakeFeatureLayer_management()?
  • in_memory스크립트 끝에서 작업 공간 삭제와 같은 표준이 있습니까?

답변:


41

최근에 "in_memory"를 꽤 많이 사용했습니다. 특정 작업의 처리 속도를 획기적으로 높일 수 있기 때문에 매우 유용 할 수 있지만 매우 큰 데이터 세트로 작업하는 경우 프로그램이 중단 될 수 있습니다.

"in_memory"를 사용하여 프로세스 출력을 정의 할 수 있습니다. 종종 피쳐 ​​클래스에서 작업을 수행하는 경우 먼저 "in_memory"작업 공간에 복사합니다.

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

내가했던 것처럼 memoryFeature를 함께 연결할 필요는 없습니다. "in_memory \ myMemoryFeature"로 작성할 수 있습니다. "in_memory"와 실제 디렉토리 사이를 쉽게 전환 할 수있는 방법을 좋아합니다. 그런 다음 메모리에서 기능에 대한 프로세스를 수행 할 수 있습니다. 완료되면 프로세스를 되돌려 디렉토리에 다시 저장할 수 있습니다.

틀릴 수도 있지만 기능 레이어를 만드는 것과 같지 않다고 생각합니다. 피처 레이어를 사용하면 선택 방법 및 기타 레이어 별 작업에 액세스 할 수 있습니다. "in_memory"디렉토리를 래스터 객체와 동등한 벡터로 생각하십시오 (raster = arcpy.Raster (myRasterLocation))

"in_memory"를 사용한 후 정리하려면 다음 코드를 추가하면됩니다.

arcpy.Delete_management("in_memory")

희망이 도움이됩니다.


3
@egdetti에 동의합니다. 매우 유용하고 강력하며 처리 속도를 크게 향상시킵니다. 그러나 실제로 작업 공간 / 계층을 삭제할 필요는 없습니다. 응용 프로그램을 닫을 때 자체적으로 정리되기 때문입니다. 언급했듯이, in_memory 작업 공간에 너무 많은 것들이 있어 RAM이 부족한 경우 arcpy.Delete를 실행하면 도움이 될 수 있습니다 .
— RyanDalton

12

그다지 많지 않습니다. 지오 프로세싱 도구 및 이름이 지정된 arcpy 커서에서 액세스 할 수있는 매직 디렉토리가 있습니다 in_memory. 당신이 뭔가를 할 거라고 arcpy.management.CreateTable('in_memory', 'my_new_table')또는 CreateFeatureClass새로운 featureclass 또는 테이블을 만들 수 있습니다. 그런 다음 경로가있는 프로세스에 새 테이블 in_memory\my_new_table이 있습니다. 아크 맵에 있으면 my_new_table바로 가기로 사용할 수있는 목차에 테이블보기가 추가 됩니다. 임시 메모리 테이블 인 arcpy.management.Delete(r'in_memory\my_new_table')경우 스크립트 끝에서 완료했을 때 사용 하십시오.


9

주제를 약간 벗어 났지만 지적 할 가치가 있다고 생각합니다. 먼저 위의 @JasonScheirer와 @egdetti에 in_memory매우 동의 할 수 있습니다. 가장 주목할 점은 in_memory작업 공간이 래스터 데이터를 지원하지 않는다는 것입니다. 이것이 문제가되면 Python tempfile모듈을 사용하는 것이 좋습니다. 이것은 빠르지는 않지만 더 안정적입니다. 예를 들어 다음과 같은 작업을 수행 할 수 있습니다.

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는 arcpy.Raster () 메소드에 내장 된 래스터를 처리하는 방법을 가지고 있습니다. myRaster = arcpy.Raster ( "C : \ RasteLocation")와 같은 변수를 정의하여 맵 대수 계산 및 다양한 기타 래스터 작업에 쉽게 사용할 수있는 래스터 객체를 메모리에 만듭니다. 이러한 래스터 객체를 저장하는 것은 myRaster.save ( "C : \ SaveLocation")에 쓰는 것만 큼 간단합니다. arcpy가 테이블에 가져 오는 매우 유용한 기능입니다.
— bluefoot

@egdetti 공정한 전화. 그래도 더 큰 데이터 세트를 처리하는 방법을 알고 싶습니다.
— om_henners

1
@mbenedetti-Raster 객체는 가능한 한 늦게 아크 피 스크래치 작업 공간에 래스터를 씁니다. 아크 피는 단일 셀 처리 도구 (예 : "+"등)를 단일 실행 프로세스에 쌓아서 I / O를 최적화 할 수 있습니다. 예를 들어. save () 메소드는 래스터 처리를 강제로 실행합니다.
— 커티스 가격

3
@om_henners in_memory는 ArcGIS 10.1에서 래스터를 지원합니다!
— 커티스 가격

2
@om_henners arcpy는 스크래치 이름을 생성하는 도구를 제공합니다. 예를 들어 폴더의 스크래치 피처 클래스에는 자동으로 ".shp"가 추가되어 있습니다. 메소드는 arcpy.CreateScratchName ()입니다.
— 커티스 가격
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.