もっと

マルチプロセッシングまたはプールを使用してArcPyスクリプトのパフォーマンスを向上させる方法

マルチプロセッシングまたはプールを使用してArcPyスクリプトのパフォーマンスを向上させる方法


巨大なデータセットで実際に実行速度が遅いアークピースクリプトを作成しました。その中の100000機能など。マルチプロセッシングがarcpyスクリプトスクリプトのパフォーマンスを向上させることができることを以下のパスから読みました。 http://blogs.esri.com/esri/arcgis/2011/08/29/multiprocessing/自分で試して、コードに適用しました。

「ファイルが見つかりませんでした:multiprocessing.forkingからimport main; main()。mxd」というエラーが表示されます。

このエラーが何を意味するのか理解できず、エラーに関する参照やインターネットソースからのヘルプを得ることができませんでした。

以下は、(ユーザー入力によって定義された)近くのバッファー領域で実際に重複を見つけるコードです。

import arcpy import os import multiprocessing#入力の定義inputFeatureClass = arcpy.GetParameterAsText(0)InputField = arcpy.GetParameterAsText(1)Distance = arcpy.GetParameterAsText(2)#UNIIDとdupフィールドが存在するかどうかをチェックします。 = ["UNIID"、 "Dup"]#既存のフィールド名のリストを作成しますfieldList = arcpy.ListFields(inputFeatureClass)fieldName = [f.name for f in fieldList] for field in to_add:if not field in fieldName:arcpy。 AddField_management(inputFeatureClass、 "UNIID"、 "TEXT")arcpy.AddField_management(inputFeatureClass、 "Dup"、 "SHORT")#シーケンス番号をUNIIDフィールドに更新するrows = arcpy.UpdateCursor(inputFeatureClass)counter = 1 for row in rows:row .UNIID = counter rows.updateRow(row)counter + = 1#プログレッサーの設定RowCount = arcpy.GetCount_management(inputFeatureClass)PACnt = int(RowCount.getOutput(0))arcpy.SetProgressor( "step"、 "FindingDuplicate…" 、0、PACnt、1)def Find_dup(oid_range):i = oid_range [0] j = oid_range [1] lyr = arcpy .management.MakeFeatureLayer(inputFeatureClass、 'layer {0}'。format(i)、 "OID> = {0} AND OID <= {1}" .format(i、j))#内部のすべてのポイントの近くのポイントを選択arcpy.da.SearchCursor(lyr、["UNIID"、InputField])をカーソルとして持つsearchcursor:カーソル内の行の場合:value = row [0] field = "UNIID" exp = field + "= '" + value + "'" point_lyr = arcpy.SelectLayerByAttribute_management(lyr、 "NEW_SELECTION"、exp)arcpy.SelectLayerByLocation_management(point_lyr、overlap_type = "WITHIN_A_DISTANCE"、select_features = point_lyr、search_distance = Distance + "Meters"、selection_type = "NEW_SELECTION")#選択したポイントをプッシュカーソル内の行のoccursTwice = [] cursor = arcpy.da.SearchCursor(lyr、[InputField]):occursTwice.append(row [0])del cursor #Array内のすべてのフィールド値の発生をカウントし、dupフィールドに更新しますcursor =カーソル内の行のarcpy.da.UpdateCursor(lyr、[InputField、 'Dup']):#dupにすでに重複する値が含まれているかどうかを確認し、含まれている場合は、発生した場合に低い値を更新しないt(row [0])> row [1]:row [1] = occursTwice.count(row [0])cursor.updateRow(row)del cursor del point_lyr arcpy.SetProgressorPosition()def main():oid_ranges = [ [0、1000]、[1001、2000]、[2001、3000]、[3001、4000]、[4001、5000]、[5001、6000]、[6001、7000]、[7001、8000]、[8001 、9000]、[9001、10001]] arcpy.env.overwriteOutput = True pool = multiprocessing.Pool(processes = 4)pool.map(Find_dup、oid_ranges)pool.close()pool.join()if __name__ == ' __main __ ':main()#UNIIDフィールドを削除し、すべての選択を解除するarcpy.DeleteField_management(inputFeatureClass、 "UNIID")arcpy.SelectLayerByAttribute_management(inputFeatureClass、 "CLEAR_SELECTION")arcpy.ResetProgressor()

これはArcMapsランタイム環境の制限のようです。引用するには JScheirer スレッドArcpyMultiprocessorの問題でこの問題をさらに説明しているESRIから:

「スクリプトを機能させるには、スクリプトをアウトプロセスで実行する必要があります(スクリプトツールの設定ダイアログにチェックボックスがあります)。ArcMapは、マルチプロセッシングがランタイムをブートストラップする方法と互換性がない可能性のあるランタイム環境をセットアップします。」


ビデオを見る: Python: Map Automation in ArcGIS Pro