Xóa tính năng lớp tính năng nhanh hơn bằng ArcPy?


8

Tôi đã viết tập lệnh này đệ quy qua tất cả các lớp đối tượng trong một tập hợp các bộ dữ liệu tính năng nhất định và xóa tất cả các tính năng của chúng. Nó xuất hiện để thực hiện công việc nhưng nó chạy khá chậm. Có bất cứ điều gì tôi đang làm sai ở đây hoặc có bất kỳ cách rõ ràng để tăng tốc mọi thứ?

Tôi đang sử dụng DeleteFeatures_man quản lý để thực hiện hành động. DeleteRows_man quản lý dường như cũng hoạt động.

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)

CHỈNH SỬA -

Tôi đặt một số bộ định thời hiệu suất trong tập lệnh và đây là dữ liệu:

  • Thời gian để truy xuất bộ dữ liệu: 0: 00: 01.254000
  • Tổng số lớp tính năng: 1682
  • Tổng số lớp tính năng với dữ liệu: 124
  • Tổng số tính năng được xử lý: 190222
  • Tổng thời gian chạy : 3 giờ, 16 phút

Sự phá vỡ:

Tập dữ liệu tính năng -> liệt kê các cuộc gọi lớp tính năng:

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

Cuộc gọi đếm tính năng (phần lớn thời gian):

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

Các cuộc gọi xóa tính năng (giảm vì chỉ các lớp tính năng có hàng được xử lý):

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

Câu trả lời:


14

Phần nào của kịch bản đang thực sự chiếm phần lớn thời gian? Có khoảng 5 bước khác đang diễn ra trước khi bạn thực sự bắt đầu xóa nội dung.

Bạn có thể muốn chia kịch bản của mình thành các bài kiểm tra cỡ cắn. Ví dụ: thay vì tạo tệp kết nối tạm thời, liệt kê một loạt các bộ dữ liệu, liệt kê nội dung của chúng, đếm hồ sơ của chúng và cuối cùng thực sự làm những gì bạn muốn làm (xóa các tính năng), chỉ cần chuyển vào một lớp tính năng duy nhất có tiền đề kết nối tập tin với DeleteFeatures và xem mất bao lâu.

Nếu điều đó thực hiện có thể chấp nhận được thì hãy tạo một thử nghiệm khác để xác định thời điểm xảy ra sự cố tiềm ẩn tiếp theo: đếm hàng. Và một lớp khác để liệt kê các lớp đối tượng trong bộ dữ liệu tính năng và một lớp khác để liệt kê các bộ dữ liệu tính năng trong cơ sở dữ liệu địa lý.

Mặt khác, nếu DeleteFeatures không thực hiện được chấp nhận, thì ít nhất chúng ta cũng biết vấn đề ở đâu. Trong trường hợp đó, tôi sẽ có xu hướng xem xét cách thức cơ sở dữ liệu địa lý của bạn được thiết kế:

  • Có bất kỳ bộ dữ liệu tính năng của bạn được phiên bản? Khi sử dụng phiên bản tồn tại một cặp bảng A (thêm) và D (xóa) bổ sung cho mỗi bảng được phiên bản và khi bạn xóa các tính năng bạn không xóa các bản ghi trong bảng cơ sở, bạn đang thêm các bản ghi vào bảng D. Điều này sẽ mất nhiều thời gian hơn nếu nó không được phiên bản.

  • Vì tất cả các lớp đối tượng của bạn dường như nằm trong bộ dữ liệu tính năng, chúng có tham gia vào hành vi cơ sở dữ liệu địa lý như cấu trúc liên kết hoặc mạng hình học không? Khi bạn thêm / xóa / sửa đổi các tính năng tham gia vào hành vi cơ sở dữ liệu địa lý, sẽ có nhiều chi phí hơn.

  • Cũng lưu ý rằng trái với niềm tin phổ biến, các bộ dữ liệu tính năng không được thiết kế để được sử dụng như một công cụ tổ chức:

    Các bộ dữ liệu tính năng tồn tại trong cơ sở dữ liệu địa lý để xác định phạm vi cho tham chiếu không gian. Tất cả các lớp đối tượng tham gia vào các mối quan hệ cấu trúc liên kết với nhau (ví dụ: mạng hình học) phải có cùng tham chiếu không gian. Các tập dữ liệu tính năng là một cách để nhóm các lớp đối tượng có cùng tham chiếu không gian để chúng có thể tham gia vào các mối quan hệ cấu trúc liên kết với nhau.

    Đối với hầu hết người dùng, các bộ dữ liệu tính năng cũng có chất lượng tổ chức tự nhiên, giống như một thư mục trên hệ thống tệp. Vì đối với nhiều ứng dụng GIS, phần lớn dữ liệu có cùng tham chiếu không gian, sự cám dỗ để nhóm số lượng lớn các lớp đối tượng thành các tập dữ liệu tính năng là không thể cưỡng lại.

    Bộ dữ liệu tính năng, tuy nhiên, không miễn phí. Khi bạn mở một lớp đối tượng có trong một bộ dữ liệu tính năng để xem các thuộc tính của nó hoặc vẽ hoặc truy vấn nó trong ArcCatalog ™, ArcMap ™ hoặc một ứng dụng tùy chỉnh, tất cả các lớp tính năng khác trong bộ dữ liệu tính năng đó cũng được mở. Điều này được thực hiện bởi vì các bản cập nhật cho một lớp đối tượng trong bộ dữ liệu tính năng có thể có khả năng gợn lên các lớp đối tượng khác trong tập dữ liệu tính năng tham gia vào các mối quan hệ cấu trúc liên kết.

    Từ: Hệ thống thông tin địa lý Multiuser với ArcInfo 8 (tháng 4 năm 2000)

    Vì vậy, đó có thể là một nguồn chi phí khác ngay cả khi họ không tham gia vào một cấu trúc liên kết hoặc mạng hình học.

Ngoài các lệnh DeleteFeatures / DeleteRows của Arcpy:

  • Nếu bạn có quyền truy cập lệnh quản trị SDE, bạn có thể sử dụng:

    sdetable -o truncate -t <tablename>

    Vấn đề này rút ngắn các lệnh bảng cho DBMS của bạn để nó nhanh hơn nhiều, nhưng lưu ý rằng điều này bỏ qua hành vi cơ sở dữ liệu địa lý.

  • Sử dụng ArcSDESQLExecute để ban hành TRUNCATE TABLEcác lệnh trực tiếp (một lần nữa bỏ qua hành vi cơ sở dữ liệu địa lý), nhưng điều này rất dễ xảy ra vì bạn sẽ cần phải phát hành một bảng cho mỗi bảng tạo nên một lớp tính năng (cơ sở, F, S, I, A, D, v.v. .) Không làm điều này một cách cẩn thận và chính xác có thể khiến dữ liệu của bạn ở trạng thái không nhất quán.


Đây là lời khuyên tuyệt vời. Tôi sẽ đặt một số bộ hẹn giờ cho mỗi thao tác và đăng kết quả. Ít nhất là từ phản hồi cho đến nay có vẻ như tôi đang sử dụng các phương thức API ArcPy thích hợp. Tôi vẫn đang học API ArcPy vì vậy tôi lo ngại có một số phương pháp khác tôi nên sử dụng.
Andy Arismendi

Theo như Arcpy, tôi nghĩ rằng DeleteRows và DeleteFeatures là cách tốt nhất bạn có thể làm nhưng tôi đã thêm một số tùy chọn khác có thể đáng để xem xét ít nhất nếu điều này rất quan trọng.
blah238

Tôi đã thêm một số số liệu hiệu suất ở trên. Có 1682 lớp tính năng. Mặc dù tính trung bình chỉ mất 1/3 thời gian để xóa. Cấp các hoạt động xóa chỉ xử lý các lớp tính năng với các tính năng. Tôi sẽ thử xóa số đếm và chỉ cần chuyển tất cả các lớp tính năng sang DeleteRows_man Quản lý và xem cách loại bỏ. Tôi cũng sẽ thử sdetable bằng tùy chọn cắt ngắn.
Andy Arismendi

2
Yike, 1682 lớp tính năng?! Tôi chắc chắn sẽ xem xét một quy trình công việc thay thế để xử lý nhiều dữ liệu đó. Khi bạn bắt đầu nói về hàng trăm bảng, bạn thực sự nên ở phía sau làm việc với DBMS trực tiếp IMO. Yêu cầu các DBA của bạn nấu thứ gì đó bằng PL / SQL hoặc thứ gì đó :)
blah238

Chỉ có 124 lớp tính năng thực sự có các tính năng, phần còn lại là trống rỗng. BTW bạn chỉ cho tôi một ý tưởng! Có lẽ việc tạo tệp kết nối SDE bằng kết nối trực tiếp của Oracle sẽ giúp cải thiện hiệu suất. Tôi sẽ thử tiếp theo.
Andy Arismendi

9

Nếu nâng cấp lên ArcGIS 10.1 (hiện đã được phát hành) là một tùy chọn thì tôi chỉ tìm thấy điều này trong What's New in ArcGIS 10.1 PDF:

Công cụ mới để xóa tất cả các hàng khỏi bảng

Công cụ xử lý địa lý TruncateTable trong bộ công cụ Bảng có thể được sử dụng để xóa tất cả các hàng khỏi bảng hoặc lớp đối tượng. Bạn nên sử dụng công cụ Truncate Table thay vì công cụ Xóa hàng khi bạn muốn xóa tất cả các hàng khỏi một bảng hoặc lớp tính năng.

Trợ giúp trực tuyến của nó có thể được tìm thấy ở đây .


1
Tốc độ này nhanh hơn nhiều so với DeleteRows
nmpeterson 19/03/13

3
Chỉ có điều, nó không hỗ trợ các bảng tính năng / các lớp tính năng.
Ruchira Welikala

5

Tại sao không chỉ xóa các bộ dữ liệu tính năng với arcpy.DeleteFeatures_management(dataset)? Nếu bạn vẫn cần bộ dữ liệu tính năng tồn tại, bạn có thể chỉ cần tạo lại nó sau khi nó bị xóa.


Tôi cần giữ các bộ dữ liệu tính năng và các lớp tính năng của chúng vì chúng không được tạo lại nhanh chóng do sự kết hợp SDE / Oracle và có khá nhiều lớp tính năng. Tôi đang cố gắng xóa các tính năng nhanh nhất có thể.
Andy Arismendi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.