ArcPyを使用してフィーチャクラスフィーチャをより速く削除しますか?


8

特定のフィーチャデータセットのセットに含まれるすべてのフィーチャクラスを再帰し、それらのすべてのフィーチャを削除するこのスクリプトを作成しました。それは仕事をするように見えますが、それはかなりゆっくり実行されます。ここで私が間違っていることはありますか、それともスピードアップする明白な方法はありますか?

DeleteFeatures_managementを使用して証書を作成しています。DeleteRows_managementも機能しているようです。

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)

編集 -

スクリプトにパフォーマンスタイマーをいくつか追加しました。ここにデータがあります。

  • データセットを取得する時間:0:00:01.254000
  • フィーチャクラスの合計:1682
  • データ付きのフィーチャクラスの総数:124
  • 処理された機能の合計:190222
  • 合計実行時間:3時間16分

内訳:

フィーチャデータセット->フィーチャクラス呼び出しのリスト:

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

機能数の呼び出し(大部分の時間):

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

機能削除呼び出し(行のある機能クラスのみが処理されるため削減されました):

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

回答:


14

スクリプトのどの部分が実際にほとんどの時間を占めていますか?実際にデータの削除を開始する前に、約5つのステップが進行中です。

スクリプトを一口サイズのテストに分解することができます。たとえば、一時的な接続ファイルを作成する代わりに、一連のデータセットをリストし、それらのコンテンツをリストし、レコードを数え、最後に実際にやりたいことを行って(フィーチャを削除)、あらかじめ作成された単一のフィーチャクラスを渡します。 DeleteFeaturesへの接続ファイルを作成し、その所要時間を確認します。

それが許容範囲内で実行される場合は、次の潜在的な問題点である行をカウントするための別のテストを作成します。もう1つは、フィーチャデータセット内のフィーチャクラスをリストするためのもので、もう1つは、ジオデータベース内のフィーチャデータセットをリストするためのものです。

一方、DeleteFeaturesが許容範囲内で実行されない場合は、少なくとも問題がどこにあるかがわかります。その場合は、ジオデータベースがどのように設計されているかを見てみたいと思います。

  • バージョン管理されているフィーチャデータセットはありますか?バージョン管理を使用する場合、バージョン対応のテーブルごとに追加のA(追加)テーブルとD(削除)テーブルのペアが存在します。機能を削除すると、ベーステーブルのレコードは削除されず、Dテーブルにレコードが追加されます。これは、バージョン管理されていない場合よりもはるかに時間がかかります。

  • フィーチャクラスはすべてフィーチャデータセットにあるように見えるので、トポロジやジオメトリックネットワークなどのジオデータベースの動作に参加していますか?ジオデータベースの動作に参加しているフィーチャを追加/削除/変更すると、オーバーヘッドが大幅に増加します。

  • また、一般的な考えに反して、フィーチャデータセットは整理ツールとして使用するようには設計されていません。

    空間参照の範囲を定義するフィーチャデータセットがジオデータベースに存在します。相互のトポロジー関係(たとえば、ジオメトリックネットワーク)に参加するすべてのフィーチャクラスは、同じ空間参照を持つ必要があります。フィーチャデータセットは、フィーチャクラスを同じ空間参照でグループ化して、それらが互いにトポロジー関係に参加できるようにする方法です。

    ほとんどのユーザーにとって、機能データセットは、ファイルシステム上のフォルダーのように、自然な編成品質も備えています。多くのGISアプリケーションでは、データの大部分が同じ空間参照を持っているため、多数のフィーチャクラスをフィーチャデータセットにグループ化する誘惑は非常に魅力的です。

    ただし、フィーチャデータセットは無料ではありません。フィーチャデータセットに含まれるフィーチャクラスを開いてそのプロパティを確認するか、ArcCatalog™、ArcMap™、またはカスタムアプリケーションでそれを描画またはクエリすると、そのフィーチャデータセット内の他のすべてのフィーチャクラスも開かれます。これは、フィーチャデータセット内のフィーチャクラスを更新すると、トポロジ関係に参加するフィーチャデータセット内の他のフィーチャクラスに波及する可能性があるためです。

    From:ArcInfo 8を使用したマルチユーザー地理情報システム(2000年4月)

    そのため、トポロジやジオメトリックネットワークに参加していない場合でも、それがオーバーヘッドの別の原因になる可能性があります。

arcpyのDeleteFeatures / DeleteRowsコマンドを超えて:

  • あなたが持っている場合はSDE管理コマンドのアクセスをあなたが使用できます。

    sdetable -o truncate -t <tablename>

    これにより、DBMSにトランケートテーブルコマンドが発行されるため、処理速度が大幅に向上しますが、ジオデータベースの動作は無視されることに注意してください。

  • ArcSDESQLExecuteを使用してTRUNCATE TABLE直接コマンドを発行する(ジオデータベースの動作をバイパスする)が、フィーチャクラス(ベース、F、S、I、A、Dなどを構成するテーブルごとに1つ発行する必要があるため、これは非常にトラブルが発生しやすい。)これを注意深く正しく行わないと、データが不整合な状態になる可能性があります。


これは素晴らしいアドバイスです。各操作にいくつかのタイマーを設定し、結果を投稿します。少なくともこれまでのフィードバックから、適切なArcPy APIメソッドを使用しているように思えます。私はまだArcPy APIを学習しているので、使用する必要がある他のメソッドがあるかどうか心配しました。
アンディアリスメンディ

arcpyに関する限り、私はDeleteRowsとDeleteFeaturesがあなたができる最高のことだと思いますが、少なくともこれが時間重視の場合に検討する価値のある他のオプションをいくつか追加しました。
blah238

上記のパフォーマンスメトリックをいくつか追加しました。1682のフィーチャクラスがあります。ただし、平均すると、削除にかかる時間の1/3しかカウントされません。削除操作が許可されているのは、フィーチャを持つフィーチャクラスのみを処理した場合です。カウントを削除して、すべてのフィーチャクラスをDeleteRows_managementに渡して、どのように機能するかを確認します。また、truncateオプションを使用してsdetableを試します。
アンディアリスメンディ2012年

2
いいね、1682フィーチャクラス?!私は間違いなく多くのデータを処理するための代替ワークフローを検討します。何百ものテーブルについて話し始めると、DBMSを直接IMOで操作しているバックエンドにいるはずです。DBAにPL / SQLなどで何かを
作ってもらい

124のフィーチャクラスのみが実際にフィーチャを持ち、残りは空でした。ところであなたはちょうど私にアイデアを与えました!おそらく、Oracle直接接続を使用してSDE接続ファイルを作成すると、パフォーマンスの向上に役立ちます。次に試してみます。
アンディアリスメンディ2012年

9

ArcGIS 10.1(現在リリースされている)へのアップグレードがオプションである場合、私はこれをArcGIS 10.1の新機能のPDFで見つけました。

テーブルからすべての行を削除する新しいツール

テーブルツールセットのTruncateTableジオプロセシングツールを使用して、テーブルまたはフィーチャクラスからすべての行を削除できます。テーブルまたはフィーチャクラスからすべての行を削除する場合は、行の削除ツールの代わりにテーブルの切り捨てツールを使用する必要があります。

そのオンラインヘルプはここにあります


1
これはDeleteRowsよりもはるかに高速です
nmpeterson 2013年

3
唯一のことは、バージョン対応のテーブル/機能クラスをサポートしないことです。
ルチラウェリカラ

5

なぜフィーチャデータセット自体を削除しないのarcpy.DeleteFeatures_management(dataset)ですか?それでもフィーチャデータセットが存在する必要がある場合は、削除した後でそれを再作成するだけです。


フィーチャデータセットとそれらのフィーチャクラスを保持する必要があります。SDEとOracleの組み合わせのためにフィーチャデータセットとフィーチャクラスがすぐに再作成されることはなく、フィーチャクラスが多数あるためです。機能をできるだけ早く削除しようとしています。
アンディアリスメンディ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.