Ini pertanyaan yang cukup umum. Saya hanya ingin tahu tips dan trik apa yang telah digunakan programmer GIS untuk mempercepat skrip arcpy yang Anda impor ke dalam kotak peralatan dan jalankan.
Saya bekerja paling banyak setiap hari menulis skrip kecil untuk membantu pengguna non-GIS di kantor saya memproses data GIS. Saya telah menemukan bahwa pemrosesan ArcGIS 10.0 secara umum lebih lambat dari 9.3.1 dan kadang-kadang bahkan lebih lambat ketika menjalankan skrip python.
Saya akan mencantumkan contoh skrip tertentu yang berjalan lebih dari 24 jam. Itu adalah loop yang menabulasi area raster di buffer untuk setiap bentuk di buffer. Buffer memiliki sekitar 7000 bentuk. Saya tidak percaya itu harus berjalan selama ini. SEBUAH
while x <= layerRecords:
arcpy.SetProgressorLabel("Tabulating Row: " + str(x) + " of " + str(ELClayerRecords))
arcpy.SelectLayerByAttribute_management(Buff,"NEW_SELECTION", "Recno = " + str(x)) # Selecting the record
TabulateArea(Buff, "Recno", MatGRID, "VALUE", ScratchWS + "/tab" + str(z) +".dbf", nMatGRIDc) # Tabulate the area of the single row
arcpy.AddMessage (" - Row: " + str(x) + " completed")
x = x + 1
z = z + 1
Sebelum ada yang mengatakannya, saya telah menjalankan area tabulasi pada seluruh buffer, tetapi menghasilkan kesalahan jika dijalankan pada lebih dari 1 record. Ini alat yang cacat, tapi saya harus menggunakannya.
Bagaimanapun, jika ada yang punya ide tentang bagaimana mengoptimalkan, atau mempercepat skrip ini, itu akan sangat dihargai. Jika tidak, apakah Anda punya trik mempercepat untuk python, ketika digunakan di ArcGIS?
sumber
Teknik optimasi python umum dapat menghemat banyak waktu.
Salah satu teknik yang sangat bagus untuk mendapatkan lowdown di mana penahanan dalam skrip Anda adalah menggunakan modul cProfile bawaan:
Pengujian menggunakan sampel data kecil akan memungkinkan Anda menentukan dengan tepat panggilan fungsi mana yang paling banyak menghabiskan waktu.
Petunjuk umum untuk kode python yang lebih cepat:
Sehubungan dengan skrip Anda, saya tidak dapat mengomentari aspek ArcPy karena saya tidak memiliki Arc yang diinstal pada komputer ini, tetapi Anda mungkin ingin mencoba menggunakan for loop alih-alih loop sementara melihat apakah itu meningkatkan sesuatu. Juga x = x + 1 dapat ditulis sebagai x + = 1:
sumber
Pastikan Anda menulis ke drive internal di komputer. Menjangkau seluruh jaringan ketika tidak perlu dapat benar-benar memperlambat pemrosesan. Bahkan bisa lebih cepat untuk menyalin data sebagai langkah pertama dalam proses untuk menjaga baca-tulis berikutnya secepat mungkin
Menjalankan skrip sepenuhnya di luar ArcMap bisa jauh lebih cepat. Jika Peta tidak diperlukan selama pemrosesan, maka jangan gunakan ArcMap.
sumber
Calculate Value
dialog) akan memproses lebih cepat daripada menjalankan skrip yang sama dari jendela ArcPy di ArcMap. Itu murni pengamatan anekdotal.Ini mungkin tidak menjawab pertanyaan Anda untuk menjalankan alat ArcPy di dalam ArcMap tetapi ketika saya perlu melakukan pengolahan gemuk dengan alat geo-processing dan Python saya cenderung menjalankannya di luar sistem GIS menggunakan IDE PyScripter . Saya menemukan ini berjalan lebih cepat. Saya juga menggunakan RAMDISK untuk dataset output sementara kecil (sedikit seperti ruang kerja in_memory )
Yah mereka adalah tips utama saya! :)
sumber
Coba komentari arcpy.SetProgressorLabel dan lihat seberapa cepat Anda mempercepatnya. Saya telah menemukan bahwa setiap output layar, kembali ke DOS linglung, secara drastis memperlambat waktu pemrosesan. Jika Anda benar-benar perlu melihat output itu, coba perlihatkan setiap loop ke-N.
sumber
Pastikan Anda menghapus
import xxxx
baris yang tidak digunakan.(mis. jika Anda belum menggunakan fungsi matematika apa pun yang Anda miliki
import Math
, ini akan memakan waktu dari pemuatan skrip)Meskipun ini tidak akan berdampak besar pada skrip tunggal yang berjalan (seperti skrip Anda), ini akan memengaruhi skrip apa pun yang sering berjalan dan berulang.
sumber
import Math
mungkin contoh yang buruk. Namun, beberapa perpustakaan ArcPy yang lebih besar membutuhkan banyak waktu untuk memuat.