少し前に、属性テーブルをPython辞書に変換するための簡単なPython関数を作成しました。キーはユーザー指定の一意のIDフィールド(通常はOIDフィールド)から取得されます。さらに、デフォルトではすべてのフィールドが辞書にコピーされますが、サブセットのみを指定できるようにするパラメーターが含まれています。
def make_attribute_dict(fc, key_field, attr_list=['*']):
dict = {}
fc_field_objects = arcpy.ListFields(fc)
fc_fields = [field.name for field in fc_field_objects if field.type != 'Geometry']
if attr_list == ['*']:
valid_fields = fc_fields
else:
valid_fields = [field for field in attr_list if field in fc_fields]
if key_field not in valid_fields:
cursor_fields = valid_fields + [key_field]
else:
cursor_fields = valid_fields
with arcpy.da.SearchCursor(fc, cursor_fields) as cursor:
for row in cursor:
key = row[cursor_fields.index(key_field)]
subdict = {}
for field in valid_fields:
subdict[field] = row[cursor_fields.index(field)]
dict[key] = subdict
del subdict
return dict
これは、比較的小さなデータセットではうまく機能しますが、約750,000行と15フィールド(ファイルジオデータベースで約100MB)を含むテーブルで実行しました。これらの場合、関数の実行は予想よりもはるかに遅くなります。約5〜6分です(これは、テーブルをin_memory
ワークスペースにコピーした後です)。辞書への変換を高速化する方法を見つけるか、Pythonを使用して大量の属性データを操作するためのより良い戦略についての洞察を得たいと思います。
UpdateCursorsは、私にとってはうまくいきません。なぜなら、1つの行が変更されると、他のいくつかの行で変更を引き起こす可能性があるからです。一度に1つずつループして処理するのは、私が必要とするものでは面倒です。
2
スクリプトを最適化できる範囲を制限する要因は、カーソルを反復処理するのにかかる時間の長さです。辞書を作成せずにカーソルを繰り返し処理するのにかかる時間を比較しましたか?
—
ジェイソン
@Jasonから
—
-nmpeterson
subdict = {}
through までの行をコメントアウトするdel subdict
と、処理時間は約10秒になります。
おそらく私よりもこれについて知っているでしょうが、最適化に関して私が提供する他の唯一のことは、呼び出し
—
ジェイソン
subdict[field] = row[cursor_fields.index(field)]
がcallより速いかどうかを調べることですsubdict[field] = row.getValue(field)
。後者のシナリオでは、1つのステップを実行します。ただし、2つのリスト(cursor_fields
およびrow
)のインデックス作成と単一のESRIプロセスの使用のパフォーマンスの差はそれほど良くないかもしれませんし、さらに悪くなるかもしれません!