Apa sintaks dan penggunaan yang tepat untuk ruang kerja ArcGIS “in_memory”?

33

Saya tidak jelas bagaimana cara terbaik untuk menggunakan in_memoryruang kerja di ArcGIS. Sumber daya terbaik yang saya temukan pada subjek adalah dari ESRI tentang Menggunakan ruang kerja di-memori . Sayangnya, bagian bantuan tidak terlalu informatif. Juga, ada posting di situs ini yang secara singkat menyentuh subjek di sini dan di sini .

Pertanyaan spesifik saya:

  • Apa penggunaan dan sintaksis yang tepat untuk menggunakan in_memoryruang kerja di skrip berbasis ArcGIS / arcpy?
  • Apakah in_memoryruang kerja sama dengan, misalnya, membuat layer menggunakan arcpy.MakeFeatureLayer_management()?
  • Apakah ada standar seperti menghapus in_memoryruang kerja di akhir skrip?
Harun
sumber

Jawaban:

41

Saya telah menggunakan "in_memory" cukup baru-baru ini. Ini bisa sangat berguna, karena berpotensi meningkatkan kecepatan pemrosesan secara dramatis untuk tugas-tugas tertentu, namun jika Anda bekerja dengan kumpulan data yang sangat besar, ini dapat menyebabkan program Anda macet.

Anda dapat menggunakan "in_memory" untuk menentukan output proses ... sering, jika saya melakukan tugas pada kelas fitur, saya akan menyalinnya ke ruang kerja "in_memory" terlebih dahulu:

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

Perhatikan bahwa Anda tidak harus menggabungkan memoryFeature bersama-sama seperti yang saya lakukan, Anda dapat menuliskannya sebagai "in_memory \ myMemoryFeature", saya hanya suka melakukannya seperti itu untuk berpindah-pindah antara "in_memory" dan direktori fisik dengan mudah. Anda kemudian dapat melakukan proses pada fitur Anda dalam memori. Setelah selesai, Anda dapat membalikkan proses untuk menyimpannya kembali ke direktori.

Saya bisa saja salah, tapi saya percaya itu tidak sama dengan membuat layer fitur. lapisan fitur memberi Anda akses ke metode pemilihan dan operasi spesifik lapisan lainnya. Pikirkan direktori "in_memory" sebagai vektor yang setara dengan objek raster (raster = arcpy.Raster (myRasterLocation))

Untuk membersihkan setelah menggunakan "in_memory" cukup tambahkan baris kode berikut:

arcpy.Delete_management("in_memory")

Semoga itu bisa membantu.

kaki biru
sumber
3
Saya setuju dengan @egdetti. Ini sangat berguna, sangat kuat, dan secara signifikan mempercepat pemrosesan. Anda sebenarnya tidak perlu menghapus workspace / layer, karena akan membersihkan sendiri ketika Anda menutup aplikasi. Seperti yang telah disebutkan, menjalankan arcpy.Delete dapat membantu (kadang-kadang diperlukan) jika Anda kehabisan RAM karena Anda memiliki terlalu banyak barang di ruang kerja in_memory.
RyanDalton
12

Tidak banyak tentang itu. Ada direktori ajaib yang dapat Anda akses di alat geoprocessing dan kursor curam bernama in_memory. Anda akan melakukan sesuatu seperti arcpy.management.CreateTable('in_memory', 'my_new_table')atau CreateFeatureClassmembuat class atau tabel fitur baru. Kemudian Anda memiliki tabel baru dalam proses itu dengan path in_memory\my_new_table, jika Anda berada di arcmap itu akan menambahkan tampilan tabel ke daftar isi bernama my_new_tableyang dapat Anda gunakan sebagai jalan pintas untuk sampai ke sana. Jika ini sementara di tabel memori, cukup gunakan arcpy.management.Delete(r'in_memory\my_new_table')ketika Anda selesai dengan itu di akhir skrip Anda.

Jason Scheirer
sumber
9

Agak topik, tapi saya pikir layak menunjukkan. Pertama saya setuju dengan @JasonScheirer dan @egdetti di atas yang in_memorybisa sangat berguna. Hal terbesar yang perlu diperhatikan adalah in_memoryruang kerja tidak mendukung data raster. Jika ini menjadi masalah, saya akan merekomendasikan menggunakan tempfilemodul Python . Ini tidak akan secepat, tetapi lebih dapat diandalkan. Misalnya, Anda dapat melakukan sesuatu seperti:

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
sumber
2
arcpy memiliki cara untuk menangani raster yang ada di dalam metode arcpy.Raster (). Dengan mendefinisikan variabel seperti myRaster = arcpy.Raster ("C: \ RasteLocation") Anda membuat objek raster di memori yang dapat digunakan dalam perhitungan aljabar peta dan berbagai operasi raster lainnya dengan mudah. Menyimpan objek raster semudah menulis di myRaster.save ("C: \ SaveLocation"). Fitur yang sangat membantu yang dibawa ke meja.
bluefoot
@egdetti Panggilan yang adil. Saya ingin tahu bagaimana menangani set data yang lebih besar.
om_henners
1
@mbenedetti - objek Raster menulis raster ke ruang kerja awal arcpy - selambat mungkin, yang memungkinkan arcpy mengoptimalkan I / O dengan menumpuk alat pemrosesan sel tunggal (seperti "+" misalnya) ke dalam proses eksekusi tunggal , sebagai contoh. Metode save () akan memaksa eksekusi pemrosesan raster.
Harga Curtis
3
@om_henners in_memory mendukung raster di ArcGIS 10.1!
Harga Curtis
2
@om_henners arcpy menyediakan alat untuk membuat nama goresan, yang memiliki kelebihan dalam hal itu misalnya kelas fitur goresan di folder secara otomatis memiliki ".shp" yang ditambahkan. Metode ini adalah arcpy.CreateScratchName ().
Harga Curtis