Qual é a sintaxe e o uso adequados para o espaço de trabalho “in_memory” do ArcGIS?

33

Não estou claro qual a melhor forma de usar a área de in_memorytrabalho no ArcGIS. O melhor recurso que encontrei sobre o assunto é da ESRI, sobre o uso da área de trabalho na memória . Infelizmente, a seção de ajuda não é muito informativa. Além disso, há um post neste site que aborda brevemente o assunto aqui e aqui .

Minhas perguntas específicas:

  • Qual é o uso e a sintaxe adequados para usar a área de in_memorytrabalho em scripts baseados em ArcGIS / arcpy?
  • O in_memoryespaço de trabalho é o mesmo que, por exemplo, criar uma camada usando arcpy.MakeFeatureLayer_management()?
  • Existem padrões como excluir a área de in_memorytrabalho no final do script?
Aaron
fonte

Respostas:

41

Eu tenho usado "in_memory" bastante recentemente. Pode ser muito útil, pois tem o potencial de aumentar drasticamente as velocidades de processamento para determinadas tarefas; no entanto, se você estiver trabalhando com conjuntos de dados muito grandes, poderá causar uma falha no programa.

Você pode usar "in_memory" para definir saídas do processo ... frequentemente, se eu estiver executando uma tarefa em uma classe de recurso, copiá-la-ei primeiro para o espaço de trabalho "in_memory":

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

Observe que você não precisa concatenar memoryFeature como eu fiz, você pode escrevê-lo como "in_memory \ myMemoryFeature"; eu apenas gosto dessa maneira de alternar entre "in_memory" e um diretório físico facilmente. Você pode executar processos em seu recurso na memória. Quando terminar, você pode reverter o processo para salvá-lo novamente em um diretório.

Eu posso estar errado, mas acredito que não é o mesmo que criar uma camada de recurso. as camadas de recursos fornecem acesso a métodos de seleção e outras operações específicas da camada. Pense no diretório "in_memory" como o vetor equivalente ao objeto raster (raster = arcpy.Raster (myRasterLocation))

Para limpar depois de usar "in_memory", basta adicionar a seguinte linha de código:

arcpy.Delete_management("in_memory")

Espero que ajude.

pé azul
fonte
3
Eu concordo com @egdetti. É muito útil, muito poderoso e acelera significativamente o processamento. No entanto, você não precisa excluir a área de trabalho / camada, pois ela se limpará quando você fechar o aplicativo. Porém, como foi mencionado, executar o arcpy.Delete pode ser útil (às vezes necessário) se você ficar sem memória RAM porque possui muito material no espaço de trabalho in_memory.
RyanDalton
12

Não há muito nisso. Há um diretório mágico que você pode acessar nas ferramentas de geoprocessamento e nos cursores de arco nomeados in_memory. Você faria algo como arcpy.management.CreateTable('in_memory', 'my_new_table')ou CreateFeatureClasscriar uma nova classe ou tabela de recursos. Então você tem uma nova tabela nesse processo com o caminho in_memory\my_new_table, se você estiver no arcmap, ele adicionará uma exibição de tabela ao índice nomeado my_new_tableque você pode usar como um atalho para acessá- lo. Se for uma tabela temporária na memória, use-a arcpy.management.Delete(r'in_memory\my_new_table')quando terminar no final do seu script.

Jason Scheirer
fonte
9

Um pouco fora do tópico, mas acho que vale a pena destacar. Em primeiro lugar, concordo com @JasonScheirer e @egdetti acima que in_memorypodem ser muito úteis. A principal coisa a se notar é que o in_memoryespaço de trabalho não suporta dados rasterizados. Se isso se tornar um problema, recomendo o uso do tempfilemódulo Python . Isso não será tão rápido, mas é mais confiável. Por exemplo, você pode fazer algo como:

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
fonte
2
O arcpy possui uma maneira de lidar com rasters integrados ao método arcpy.Raster (). Ao definir uma variável como myRaster = arcpy.Raster ("C: \ RasteLocation"), você cria um objeto raster na memória que pode ser usado nos cálculos de álgebra de mapas e várias outras operações raster facilmente. Salvar um objeto rasterizado é tão simples quanto escrever em myRaster.save ("C: \ SaveLocation"). Um recurso muito útil que o arcpy traz para a mesa.
Bluefoot
@egdetti chamada justa. Estou curioso para saber como ele lida com conjuntos de dados maiores.
Om_henners 11/11/12
1
@mbenedetti - o objeto Raster grava uma varredura no espaço de trabalho de rascunho arcpy - o mais tarde possível, o que permite ao arcpy otimizar a E / S empilhando ferramentas de processamento de célula única (como "+" por exemplo) em um único processo de execução , por exemplo. O método save () forçará a execução do processamento de varredura.
Curtis Price
3
O @om_henners in_memory suporta rasters no ArcGIS 10.1!
Curtis Price
2
O @om_henners arcpy fornece uma ferramenta para criar nomes de rascunho, o que tem vantagens em que, por exemplo, uma classe de recurso de rascunho em uma pasta automaticamente adiciona ".shp" a ela. O método é arcpy.CreateScratchName ().
Curtis Price