ArcGIS “in_memory” çalışma alanının doğru sözdizimi ve kullanımı nedir?


33

in_memoryArcGIS'te çalışma alanını en iyi nasıl kullanacağımı belirsizim . Konuyla ilgili bulduğum en iyi kaynak Bellek içi çalışma alanını kullanma konusundaki ESRI'dan . Ne yazık ki, yardım bölümü pek bilgilendirici değildir. Ayrıca, bu sitede burada ve burada konuya kısaca değinen bir yazı var .

Özel sorularım:

  • in_memoryArcGIS / arcpy tabanlı komut dosyalarında çalışma alanını kullanmak için uygun kullanım ve sözdizimi nedir?
  • Çalışma in_memoryalanı, örneğin, kullanarak bir katman oluşturmakla aynı mıdır arcpy.MakeFeatureLayer_management()?
  • in_memoryBetik sonunda çalışma alanını silmek gibi standartlar var mı?

Yanıtlar:


41

Son zamanlarda oldukça "in_memory" kullanıyorum. Belirli görevler için işlem hızlarını önemli ölçüde artırma potansiyeline sahip olması çok faydalı olabilir, ancak çok büyük veri kümeleriyle çalışıyorsanız, programınızın çökmesine neden olabilir.

İşlem çıktılarını tanımlamak için "in_memory" kullanabilirsiniz ... genellikle, bir özellik sınıfında bir görev gerçekleştirdiğimde, önce "in_memory" çalışma alanına kopyalarım:

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

MemoryFeature'ı benim yaptığım gibi birleştirmek zorunda kalmayacağınızı unutmayın, "in_memory \ myMemoryFeature" olarak yazabilirsiniz, sadece "in_memory" ile fiziksel bir dizin arasında kolayca ileri geri geçiş yapmayı seviyorum. Ardından hafızanızdaki özelliğiniz üzerinde işlemler yapabilirsiniz. İşiniz bittiğinde, bir dizine geri kaydetmek için işlemi tersine çevirebilirsiniz.

Yanılıyor olabilirim, ancak bir özellik katmanı oluşturmakla aynı olmadığına inanıyorum. özellik katmanları, seçim yöntemlerine ve diğer katmana özgü işlemlere erişmenizi sağlar. "İn_memory" dizinini raster nesnesine eşdeğer vektör olarak düşünün (raster = arcpy.Raster (myRasterLocation))

"İn_memory" yi kullandıktan sonra temizlemek için aşağıdaki kod satırını eklemeniz yeterlidir:

arcpy.Delete_management("in_memory")

Umarım yardımcı olur.


3
@Egdetti ile aynı fikirdeyim. Çok kullanışlıdır, çok güçlüdür ve işlemeyi önemli ölçüde hızlandırır. Aslında, çalışma alanını / katmanı silmenize gerek yoktur, ancak uygulamayı kapattığınızda kendini temizleyecektir. Yine de belirtildiği gibi, arcpy.Delete'yi çalıştırmak, RAM'in tükenmesi durumunda kendinizi bulmakta yardımcı olabilir (çünkü , in_memory çalışma alanında çok fazla şey var).
RyanDalton

12

Çok fazla bir şey yok. Coğrafi işlem araçlarında ve adındaki arklı imleçlerde erişebileceğiniz sihirli bir dizin var in_memory. Bir şey yaparsın arcpy.management.CreateTable('in_memory', 'my_new_table')ya da CreateFeatureClassyeni bir özellik sınıfı ya da masa yaparsın . Sonra bu süreçte yol ile yeni bir tablonuz var in_memory\my_new_table, eğer armaçtaysanız, onu my_new_tablealmak için kısayol olarak kullanabileceğiniz içindekiler tablosuna tablo görünümü ekler . Bellek tablosunda geçici bir şeyse, sadece arcpy.management.Delete(r'in_memory\my_new_table')betiğinizin sonunda işiniz bittiğinde kullanın .


9

Biraz konu dışı, ama işaret etmeye değer düşünüyorum. Öncelikle hem @JasonScheirer hem de @ egdetti ile aynı fikirdeyim in_memory. Unutulmaması gereken en büyük şey, in_memoryçalışma alanının raster verilerini desteklemediğidir. Bu bir sorun olursa, Python tempfilemodülünü kullanmanızı tavsiye ederim . Bu kadar hızlı olmayacak, ancak daha güvenilir. Örneğin, şöyle bir şey yapabilirsin:

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 () yöntemiyle yerleşik rasterlerle uğraşmanın bir yolunu sunar. MyRaster = arcpy.Raster ("C: \ RasteLocation") gibi bir değişken tanımlayarak, bellekte harita cebir hesaplamalarında ve çeşitli diğer raster işlemlerinde kolayca kullanılabilecek bir raster nesne yaratırsınız. Böyle bir raster nesneyi kaydetmek, myRaster.save ("C: \ SaveLocation") içine yazmak kadar kolaydır. Arcpy'nin masaya getirdiği çok faydalı bir özellik.
BlueFoot

@ egdetti Fuar çağrısı. Ancak daha büyük veri setlerini nasıl işlediğini bilmek merak ediyorum.
om_henners

1
@mbenedetti - Raster nesnesi arkik çizik çalışma alanına raster yazar - mümkün olduğu kadar geç, bu da tek hücreli işleme araçlarını (örneğin, "+" gibi) tek bir yürütme işleminde istifleyerek arcp'in I / O'yu optimize etmesini sağlar , Örneğin. Save () yöntemi, raster işlemenin yürütülmesini zorlar.
Curtis Fiyatı

3
@ om_henners in_memory ArcGIS 10.1'deki rasterleri destekliyor!
Curtis Fiyatı

2
@ om_henners arcpy, çizik isimleri oluşturmaya yarayan bir araç sağlar, örneğin bir klasördeki çizik özellik sınıfının otomatik olarak kendisine eklenmiş ".shp" olması gibi avantajlara sahiptir. Yöntem arcpy.CreateScratchName () 'dir.
Curtis Fiyatı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.