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.