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?
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":
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:
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.
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:
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 ().
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 comoarcpy.management.CreateTable('in_memory', 'my_new_table')
ouCreateFeatureClass
criar uma nova classe ou tabela de recursos. Então você tem uma nova tabela nesse processo com o caminhoin_memory\my_new_table
, se você estiver no arcmap, ele adicionará uma exibição de tabela ao índice nomeadomy_new_table
que você pode usar como um atalho para acessá- lo. Se for uma tabela temporária na memória, use-aarcpy.management.Delete(r'in_memory\my_new_table')
quando terminar no final do seu script.fonte
Um pouco fora do tópico, mas acho que vale a pena destacar. Em primeiro lugar, concordo com @JasonScheirer e @egdetti acima que
in_memory
podem ser muito úteis. A principal coisa a se notar é que oin_memory
espaço de trabalho não suporta dados rasterizados. Se isso se tornar um problema, recomendo o uso dotempfile
módulo Python . Isso não será tão rápido, mas é mais confiável. Por exemplo, você pode fazer algo como:fonte