フィーチャクラス内のフィーチャの数をカウントする最速の方法は?


35

arcpyのデータアクセスモジュール(30倍高速な検索カーソル)の導入により、SQL基準に一致するカウント機能が従来のMakeTableView + GetCount方法論よりも高速かどうかを知りたいですか?


12
それは、機能数がarcpy.Describeオブジェクトのプロパティだけではないことをどのように愚かである
グラントハンフリーズ

これはOGR SQLを使用したogrinfoで非常に簡単でした。データセットには170000レコードのようなものがあり、インデックス付けされていないフィールドでのこのワイルドカード検索はわずか数秒で戻ってきました。VARCHARogrinfo "C:\xGIS\Vector\parcels\parcels_20140829_pmerc.ovf -sql "SELECT count(*) FROM parcels_20140829_pmerc WHERE tms like 'R39200-02-%'"
elrobis 14

回答:


2

上記の回答からソリューションをテストしましたが、実世界のデータでは違いは無視できます。他の答えの結果とは反対に、ArcMap内のarcpy.MakeTableView_managementとarcpy.da.SearchCursorの時間は同じです。

クエリを使用した場合と使用しない場合のバリエーションをテストしました。クエリバージョンのコードと、最終的な測定結果を以下に示します。

@staticmethod
def query_features(feature_class, query):

    # Method 1
    time.sleep(5)  # Let the cpu/ram calm before proceeding!
    start_time = time.clock()
    count = len(list(i for i in arcpy.da.SearchCursor(feature_class, ["OBJECTID"], query)))
    end_time = time.clock()
    arcpy.AddMessage("Method 1 finished in {} seconds".format((end_time - start_time)))
    arcpy.AddMessage("{} features".format(count))

    # Method 2
    time.sleep(5)  # Let the cpu/ram calm before proceeding!
    start_time = time.clock()
    arcpy.MakeTableView_management(feature_class, "myTableView", query)
    count = int(arcpy.GetCount_management("myTableView").getOutput(0))

    end_time = time.clock()
    arcpy.AddMessage("Method 2 in {} seconds".format((end_time - start_time)))
    arcpy.AddMessage("{} features".format(count))

以下の結果:

    No query:
    Method 1 finished in 5.3616442 seconds
    804140 features
    Method 2 in 4.2843138 seconds
    804140 features

    Many results query:
    Method 1 finished in 12.7124766 seconds
    518852 features
    Method 2 in 12.1396602 seconds
    518852 features

    Few results query:
    Method 1 finished in 11.1421476 seconds
    8 features
    Method 2 in 11.2232503 seconds
    8 features

さて、質問が回答されてから約7年が経ちましたので、SDKを改善したことを願っています!!! =)Miroを自分でテストしてくれてありがとう。
マイケルマルキエータ

47

filegeodatabase内に100万のランダムに生成されたポイントを使用した例を使用しています。ここに添付。

開始するためのコードを次に示します。

import time
import arcpy

arcpy.env.workspace = "C:\CountTest.gdb"

time.sleep(5) # Let the cpu/ram calm before proceeding!

"""Method 1"""
StartTime = time.clock()
with arcpy.da.SearchCursor("RandomPoints", ["OBJECTID"]) as cursor:
    rows = {row[0] for row in cursor}

count = 0
for row in rows:
    count += 1

EndTime = time.clock()
print "Finished in %s seconds" % (EndTime - StartTime)
print "%s features" % count

time.sleep(5) # Let the cpu/ram calm before proceeding!

"""Method 2"""
StartTime2 = time.clock()
arcpy.MakeTableView_management("RandomPoints", "myTableView")
count = int(arcpy.GetCount_management("myTableView").getOutput(0))

EndTime2 = time.clock()
print "Finished in %s seconds" % (EndTime2 - StartTime2)
print "%s features" % count

そしていくつかの初期結果:

>>> 
Finished in 6.75540050237 seconds
1000000 features
Finished in 0.801474780332 seconds
1000000 features
>>> =============================== RESTART ===============================
>>> 
Finished in 6.56968596918 seconds
1000000 features
Finished in 0.812731769756 seconds
1000000 features
>>> =============================== RESTART ===============================
>>> 
Finished in 6.58207512487 seconds
1000000 features
Finished in 0.841122157314 seconds
1000000 features

より大きく、より複雑なデータセットを想像してください。SearchCursorは無期限にクロールします。

結果にはまったく不満はありませんが、DataAccessモジュールはGIS開発サークルで広く使用されています。MakeTableView + GetCount方法論よりも柔軟性が高いため、このモジュールを使用して関数定義の一部を再構築したいと考えています。


いいまとめ。完全を期すために、IMOの最速値を追加したいと思いますが、実際には最も遅い方法(10倍遅い)です。arcpy.Statistics_analysis("RandomPoints", r"in_memory\count", [["OBJECTID", "COUNT"]]) cursor = arcpy.da.SearchCursor(r"in_memory\count", ["COUNT_OBJECTID"]) row = cursor.next() del cursor count = row[0]
ベレンド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.