Menghapus fitur fitur kelas lebih cepat menggunakan ArcPy?

8

Saya telah menulis skrip ini yang berulang melalui semua kelas fitur dalam satu set dataset fitur dan menghapus semua fitur mereka. Tampaknya melakukan pekerjaan tetapi berjalan cukup lambat. Apakah ada yang saya lakukan salah di sini atau ada cara yang jelas untuk mempercepat?

Saya menggunakan DeleteFeatures_management untuk melakukan perbuatan itu. DeleteRows_management juga tampaknya berfungsi.

import sys
import os
import arcpy
from arcpy import env
import datetime
import getpass

try:
    passwd = getpass.getpass("Enter the sde user password: ")

    sdeConnectionFileDir = os.environ.get("TEMP")
    databaseName = ""
    fileName = "temp.sde"

    # Delete any pre-existing SDE connection file.
    fullPath = sdeConnectionFileDir + '\\' + fileName
    if os.path.exists(fullPath):
        os.remove(fullPath)

    # Create temporary SDE connection file.
    arcpy.CreateArcSDEConnectionFile_management (
        sdeConnectionFileDir, fileName,
        "sdeserver", "5151", "",
        "DATABASE_AUTH", "my_sde_user", passwd,
        "SAVE_USERNAME", "SDE.DEFAULT", "SAVE_VERSION"
    )

    env.workspace = fullPath

    # ArcPy status codes.
    returnCodes = {'WARN' : 0, 'INFO' : 1, 'ERROR' : 2}

    featureDatasets = []
    featureDatasets.extend(arcpy.ListDatasets("dataset1*"))
    featureDatasets.extend(arcpy.ListDatasets("dataset2*"))
    featureDatasets.extend(arcpy.ListDatasets("dataset3*"))

    list = '[%s]' % ', '.join(map(str, featureDatasets))
    response = raw_input("\n***** WARNING!!! ***** \nAll data will be deleted from all feature classess in the following datasets: \n\n" + list + "\n\n |--> Type DELETE to begin removal: ")
    if response == "DELETE":
        print "\nStarted: " + str(datetime.datetime.now()) + "\n"
        for dataset in featureDatasets:
            print "Processing dataset: " + dataset
            for fc in arcpy.ListFeatureClasses("*", "ALL", dataset):
                rowCount = int(arcpy.GetCount_management(fc).getOutput(0))

                if rowCount > 0:
                    print "  -- Processing feature class: " + str(fc) + " (" + str(rowCount) + " rows)"
                    #arcpy.DeleteRows_management(fc)
                    arcpy.DeleteFeatures_management(fc)

        print "\nCompleted: " + str(datetime.datetime.now())

except Exception as e:
    if arcpy:
        arcpyErrors = arcpy.gp.getMessages(returnCodes['ERROR'])
        if arcpyErrors:
            sys.stderr.write(arcpyErrors + "\n")
    sys.stderr.write(str(e) + "\n")
    sys.exit(1)

EDIT -

Saya memasukkan beberapa timer kinerja ke dalam skrip dan ini adalah datanya:

  • Waktu untuk mengambil dataset: 0: 00: 01.254000
  • Total Kelas Fitur: 1682
  • Total Kelas Fitur dengan Data: 124
  • Total Fitur Diproses: 190222
  • Total Run Time : 3 jam, 16 menit

Rinciannya:

Dataset fitur -> daftar panggilan kelas fitur:

* AVG   0:00:02
* MIN   0:00:01
* MAX   0:00:07
* COUNT 40
* TOTAL 0:01:08

Fitur menghitung panggilan (sebagian besar waktu):

* AVG   0:00:06
* MIN   0:00:01
* MAX   0:00:16
* COUNT 1682
* TOTAL 2:41:00

Panggilan penghapusan fitur (dikurangi karena hanya kelas fitur dengan baris yang diproses):

* AVG   0:00:17
* MIN   0:00:02
* MAX   0:03:22
* COUNT 124
* TOTAL 0:34:31
Andy Arismendi
sumber

Jawaban:

14

Bagian mana dari skrip yang sebenarnya menghabiskan sebagian besar waktu? Ada sekitar 5 langkah lain yang terjadi sebelum Anda benar-benar mulai menghapus barang.

Anda mungkin ingin memecah skrip Anda menjadi tes berukuran gigitan. Misalnya, alih-alih membuat file koneksi sementara, daftar sekelompok dataset, daftar konten mereka, menghitung catatan mereka, dan akhirnya benar-benar melakukan apa yang ingin Anda lakukan (menghapus fitur), hanya meneruskan satu kelas fitur dengan premade file koneksi ke DeleteFeatures dan lihat berapa lama.

Jika itu berkinerja diterima maka buat tes lain untuk menentukan waktu tempat masalah potensial berikutnya: menghitung baris. Dan satu lagi untuk daftar kelas fitur dalam dataset fitur, dan satu lagi untuk daftar dataset fitur dalam geodatabase.

Jika, di sisi lain, DeleteFeatures tidak berfungsi dengan baik, maka setidaknya kita tahu di mana masalahnya. Dalam hal ini saya akan lebih cenderung melihat bagaimana geodatabase Anda dirancang:

  • Apakah ada set data fitur Anda yang diversi? Saat menggunakan versi ada pasangan tambahan dari tabel A (menambahkan) dan D (menghapus) untuk setiap tabel versi, dan ketika Anda menghapus fitur Anda tidak menghapus catatan di tabel dasar, Anda menambahkan catatan ke tabel D. Ini akan memakan waktu lebih lama daripada jika tidak diversi.

  • Karena semua kelas fitur Anda tampaknya ada dalam dataset fitur, apakah mereka berpartisipasi dalam perilaku geodatabase seperti topologi atau jaringan geometris? Ketika Anda menambah / menghapus / memodifikasi fitur yang berpartisipasi dalam perilaku geodatabase, ada banyak biaya tambahan.

  • Juga perhatikan bahwa bertentangan dengan kepercayaan populer, dataset fitur tidak dirancang untuk digunakan sebagai alat organisasi:

    Set data fitur ada di geodatabase untuk menentukan ruang lingkup untuk referensi spasial. Semua kelas fitur yang berpartisipasi dalam hubungan topologi satu sama lain (misalnya, jaringan geometris) harus memiliki referensi spasial yang sama. Kumpulan data fitur adalah cara untuk mengelompokkan kelas fitur dengan referensi spasial yang sama sehingga mereka dapat berpartisipasi dalam hubungan topologi satu sama lain.

    Bagi sebagian besar pengguna, kumpulan data fitur juga memiliki kualitas organisasi alami, mirip folder pada sistem file. Karena untuk banyak aplikasi GIS, sebagian besar data memiliki referensi spasial yang sama, godaan untuk mengelompokkan sejumlah besar kelas fitur ke dalam set data fitur tidak dapat ditolak.

    Namun, set data fitur tidak gratis. Saat Anda membuka kelas fitur yang terkandung dalam kumpulan data fitur untuk melihat propertinya atau menggambar atau menanyakannya di ArcCatalog ™, ArcMap ™, atau aplikasi khusus, semua kelas fitur lainnya dalam kumpulan data fitur tersebut juga dibuka. Ini dilakukan karena pembaruan ke kelas fitur dalam kumpulan data fitur dapat berpotensi beriak ke kelas fitur lainnya dalam kumpulan data fitur yang berpartisipasi dalam hubungan topologi.

    Dari: Sistem Informasi Geografis Multiuser dengan ArcInfo 8 (April 2000)

    Jadi itu bisa menjadi sumber overhead lain bahkan jika mereka tidak berpartisipasi dalam jaringan topologi atau geometris.

Melampaui perintah DeleteFeatures / DeleteRows arcpy:

  • Jika Anda memiliki akses perintah administrasi SDE, Anda dapat menggunakan:

    sdetable -o truncate -t <tablename>

    Masalah ini memotong perintah tabel ke DBMS Anda sehingga harus lebih cepat, tetapi perhatikan bahwa ini mengabaikan perilaku geodatabase.

  • Menggunakan ArcSDESQLExecute untuk mengeluarkan TRUNCATE TABLEperintah secara langsung (sekali lagi melewati perilaku geodatabase), tetapi ini sangat rawan karena Anda perlu mengeluarkan satu untuk setiap tabel yang membentuk kelas fitur (basis, F, S, I, A, D, dll. .) Gagal melakukan ini dengan hati-hati dan benar dapat membuat data Anda dalam keadaan tidak konsisten.

blah238
sumber
Ini saran yang bagus. Saya akan memasukkan beberapa timer untuk setiap operasi dan memposting hasilnya. Setidaknya dari umpan balik sejauh ini sepertinya saya menggunakan metode API ArcPy yang sesuai. Saya masih belajar API ArcPy jadi saya khawatir ada beberapa metode lain yang harus saya gunakan.
Andy Arismendi
Sejauh arcpy saya pikir DeleteRows dan DeleteFeatures adalah tentang yang terbaik yang dapat Anda lakukan, tetapi saya menambahkan beberapa opsi lain yang mungkin layak untuk dilihat setidaknya jika ini sangat penting waktu.
blah238
Saya menambahkan beberapa metrik kinerja di atas. Ada 1682 kelas fitur. Padahal penghitungan rata-rata hanya menghabiskan 1/3 waktu penghapusan. Memang operasi penghapusan hanya kelas fitur yang diproses dengan fitur. Saya akan mencoba menghapus hitungan dan hanya meneruskan semua kelas fitur ke DeleteRows_management dan melihat bagaimana itu keluar. Saya juga akan mencoba sdetable menggunakan opsi truncate.
Andy Arismendi
2
Astaga, 1682 kelas fitur ?! Saya pasti akan melihat alur kerja alternatif untuk menangani data sebanyak itu. Ketika Anda mulai berbicara tentang ratusan tabel Anda harus benar-benar bekerja dengan DBMS secara langsung IMO. Apakah DBA Anda memasak sesuatu dalam PL / SQL atau sesuatu :)
blah238
Hanya 124 kelas fitur yang benar-benar memiliki fitur, sisanya kosong. BTW Anda baru saja memberi saya ide! Mungkin membuat file koneksi SDE menggunakan koneksi langsung Oracle akan membantu meningkatkan kinerja. Saya akan mencobanya nanti.
Andy Arismendi
9

Jika memutakhirkan ke ArcGIS 10.1 (sekarang dirilis) adalah pilihan maka saya baru saja menemukan ini di What's New in ArcGIS 10.1 PDF:

Alat baru untuk menghapus semua baris dari sebuah tabel

Alat geoprocessing TruncateTable di Tables toolset dapat digunakan untuk menghapus semua baris dari tabel atau kelas fitur. Anda harus menggunakan alat Tabel Truncate daripada alat Delete Rows ketika Anda ingin menghapus semua baris dari tabel atau kelas fitur.

Bantuan online dapat ditemukan di sini .

PolyGeo
sumber
1
Ini jauh lebih cepat daripada DeleteRows
nmpeterson
3
Hanya saja, itu tidak mendukung tabel versi / kelas fitur.
Ruchira Welikala
5

Mengapa tidak menghapus sendiri kumpulan data fitur arcpy.DeleteFeatures_management(dataset)? Jika Anda masih membutuhkan dataset fitur, Anda dapat membuatnya kembali setelah dihapus.

orang bodoh
sumber
Saya perlu menyimpan dataset fitur dan kelas fitur mereka karena mereka tidak cepat dibuat kembali karena kombinasi SDE / Oracle dan ada beberapa kelas fitur. Saya mencoba menghapus fitur secepat mungkin.
Andy Arismendi