注:この質問には答えがありますが、カーソル処理を最適化するためのヒントがあれば、大歓迎です。更新を監視します。
現在、上司(Avenueで働く)と私(Pythonで働く)はどちらも同じ問題を解決しようとしています。むしろ、私たちは両方ともそれを解決しましたが、私たちのソリューションが動作する速度は...控えめに言っても、バラバラです。彼のスクリプトが2時間で処理するものは、最大6です。ロジックの構文と実装の実際の違いは、3.xのビットマップと10.xのカーソルだけです。私たちは両方:
1)表1の値を保管します
。2)これらの値を使用して、表2の行を照会します
。3)表2の値を保管して、新しい行として表3に挿入します。
どちらのスクリプトでも、これらのプロセスは2つのネストされたループで完了します。コード最適化の素晴らしい世界を掘り下げる前に、AvenueスクリプトのパフォーマンスをPythonと比較すると、これは予期された出来事ですか?彼のスクリプトが操作時間の点で私のものを大幅に上回ったのはこれが初めてではないので、私は恐ろしいスクリプトを作成する前に気をつけるべきことがあるかどうかを知りたいのです。
これが無関係なビットを除いた私のスクリプトです:
import arcpy
import time
import sys
import os
def recordfindcopy(inFile,query,outFile):
findRecord = arcpy.SearchCursor(inFile,query)
for record in findRecord:
copyRecord = arcpy.InsertCursor(outData) # <--- D'oh! (See answer)
field = record.FIELD
copy = copyRecord.newRow()
copy.FIELD = field
copyRecord.insertRow(copy)
StreetsFileList = [r"Path",
r"Path"]
for sfile in StreetsFileList:
inStreets = sfile
inTable = r"Path"
outData = r"Path"
fsaEntry = arcpy.SearchCursor(inTable)
for row in fsaEntry:
id = row.ID
sQuery = "ID = %s " % (str(id))
recordfindcopy(inStreets,sQuery,outData)
編集:これまでのいくつかのコメントを考えると、結合を使用してこれを行うより良い方法があるのではないかと思いますが、ブロブナジアン(今日の単語!)のサイズを考えると、疑わしいです。処理の中心は、1つのテーブルの情報を2番目のテーブルの一致するレコードに追加し、重要なフィールドのみを含む3番目のテーブルを作成することです。私はSDEを使用してこれを試したかったのですが、それは利用可能なオプションではないようです。考え?私の質問がいつもそれほど複雑である場合はお詫び申し上げますが、私は長年の煩わしさの底を突きとめようとしています。
回答済み:Jakubの単純な提案だけで、処理時間が500レコードあたり30秒から500レコードあたり3秒に短縮されました。すべての挿入で挿入カーソルを再開始すると、処理速度が大幅に低下します(明らかに)。これは、ArcView 3.xの速度に対抗するときに、このプロセスに対して行うことができる最適化ではないかもしれませんが、現時点では、これで十分です。さらなる提案は大歓迎です!