Kurangi waktu pemrosesan dalam fungsi Hapus menggunakan Arcpy di IDLE

8

Saya sedang memproses 18.000 kelas fitur (disimpan dalam file GDB), masing-masing dengan ~ 500 catatan (fitur poligon) di wilayah lautan, dan saya menjalankan skrip untuk menghapus area yang tumpang tindih dengan pantai, menggunakan fungsi Erase. Script berjalan dengan sukses, tetapi secara harfiah membutuhkan waktu berhari-hari untuk diselesaikan. Beberapa file membutuhkan waktu beberapa detik untuk diproses (saya berasumsi ini karena fakta, yang telah saya verifikasi, bahwa mereka tidak tumpang tindih dengan garis pantai) sementara beberapa kelas fitur membutuhkan waktu lebih dari satu jam untuk diproses.

Saya bekerja secara lokal pada mesin saya, menjalankan skrip di IDLE, dengan ArcGIS 10.1 (semua lisensi) pada Windows 7 32-bit, Intel DuoCore 3.33GHz, komputer RAM 4GB.

Saya sedang belajar tali dengan Python dan akan sangat menghargai tips tentang skrip saya jika ada langkah yang dapat saya ambil untuk mempercepat waktu pemrosesan. Terima kasih!

# Import modules
import arcpy
import sys
import os
from arcpy import env

arcpy.env.overwriteOutput = True
print arcpy.env.overwriteOutput

#Erase coastline from selected buffers.
workspace = "C:\\DIR\\points_buff\\"
arcpy.env.workspace = workspace
erase_output = workspace+"erased.gdb\\"
erasedirectorypath = "C:\\DIR\\points_buff\\selectedbuff.gdb"
fileList = []

for dirpath, dirnames, erases in arcpy.da.Walk(erasedirectorypath,
                                              datatype="FeatureClass",
                                              type="Polygon"):
    for erase in erases:
        fileList.append(os.path.join(dirpath, erase))
        filenameparts = erase.split('_')
        if int(filenameparts[1]) > int(1967):

            try:
        #Set variables for Erase tool
                in_features = erasedirectorypath+"\\"+erase
                coastline_feat = "C:\\DIR\\Basic_NE.gdb\\Coastline_Eastern_US"
                out_erase_feat = erase_output+erase[:-4]+"_er"
                arcpy.Erase_analysis(in_features, coastline_feat, out_erase_feat, '')
                print arcpy.GetMessages()
                print "Coastline has been erased from " + erase + " and saved to " + erase_output

            except:
                print arcpy.GetMessages()
SharonB
sumber

Jawaban:

7

Meskipun sulit untuk memecahkan masalah skrip Anda tanpa melihat data spasial, beberapa trik dan ide dapat membantu alur kerja Anda. Untuk memulai, subset dataset Anda dan coba dengan berbagai pendekatan. Masukkan jam waktu ke dalam skrip Anda untuk mengetahui seberapa cepat atau lambatnya operasi. Coba balas perintah Anda dengan a time.clock. Sebagai contoh:

import time
StartTime = time.clock()
arcpy.Erase_analysis(in_features, coastline_feat, out_erase_feat, '')
EndTime = time.clock()
print "Erase finished in %s hours" % ((EndTime - StartTime)/3600)
time.sleep(2.5)
  • Coba gunakan kekuatan ruang kerja in_memory . Secara umum, operasi yang dilakukan in_memorylebih cepat daripada yang ditulis ke disk. Gunakan in_memoryuntuk operasi perantara.

  • Daripada menggunakan perintah Hapus, gunakan serangkaian perintah berikut untuk melakukan alur kerja yang serupa:

Make Feature Layer (Manajemen Data)

Pilih Lapisan Menurut Lokasi (Manajemen Data)

Hapus Fitur (Manajemen Data)

Fitur Salin (Manajemen Data)

  • Apakah poligon Anda terlalu rumit? Larutkan (Manajemen Data) dapat membantu.
  • Pertimbangkan pendekatan berbasis raster, mungkin menggunakan masker (jika memungkinkan).
Harun
sumber
2
Menghitung waktu bisa sangat berharga untuk membandingkan metode, terutama jika Anda mencoba berbagai pendekatan pada sekelompok kecil data.
Aaron
2
Ya, ingatlah bahwa Anda dapat dengan mudah menghapus file in_memory dalam skrip Anda dengan menggunakan Delete (Manajemen Data).
Aaron
4
Berapa banyak fitur dalam file garis pantai, dan berapa jumlah simpul pada suatu fitur? Seberapa besar area yang dicakupinya? Seberapa besar area yang dicakup oleh kelas fitur Anda? Jika Anda memiliki fitur yang sangat besar dan rumit dalam file garis pantai Anda, itu mungkin menjadi sumber perlambatan. Ada beberapa metode yang digunakan untuk menyesuaikan itu jika masalahnya.
blord-castillo
2
Saya akan benar-benar pergi ke rute yang berlawanan. Pertama-tama larutkan fitur-fiturnya, kemudian pisahkan poligon besar menjadi beberapa kelas fitur terpisah masing-masing satu poligon. Coba jalankan hanya satu dari fitur kelas garis pantai fitur tunggal yang disubstitusikan ini terhadap salah satu kelas fitur Anda yang memakan waktu cukup lama (dan berpotongan). Lihat apakah itu memberi Anda perbaikan. Saya pikir amplop persimpangan Anda mungkin terlalu besar, menghilangkan semua tweak kinerja yang sudah dibangun ke dalam analisis overlay.
blord-castillo
4
Alur kerja lain untuk diuji. Jalankan Minimum Bounding Geometrypada kelas fitur target Anda menggunakan Opsi Grup ALLdan tipe geometri ENVELOPE. Lakukan penghapusan pada kelas fitur amplop yang dihasilkan menggunakan garis pantai Anda yang sangat besar. Gunakan output dari penghapusan itu untuk melakukan Clippada kelas fitur target asli Anda. Ini menyederhanakan langkah kompleks, menghapus, dan menggantinya dengan Klip yang lebih murah terhadap fitur yang lebih kecil.
blord-castillo