ArcView 3.x Avenueビットマップ(タブ?)とArcView 10 Pythonカーソルの比較


9

注:この質問には答えがありますが、カーソル処理を最適化するためのヒントがあれば、大歓迎です。更新を監視します。

現在、上司(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の速度に対抗するときに、このプロセスに対して行うことができる最適化ではないかもしれませんが、現時点では、これで十分です。さらなる提案は大歓迎です!


1
スクリプトを投稿したいですか?GPベンチマークを使用している大通りやPythonについては知りません。
Derek Swingley、2011

テーブルの結合とクエリは、古いArcView 3.2(アベニュー)では、ArcGIS 8.xから10. *のarcpy / pythonよりもはるかに高速です。基本的には、ArcGIS製品のコードの量(はるかに多い)が原因です。
Mapperz

2
@Mapperz正解です。ただし、ArcView 3.xの行ごとの処理は、要求ごとに10,000Xの解釈オーバーヘッドがあるため、非常に遅くなります(これをベンチマークしました)。ループを回避できる場合-結合やクエリなどの「高レベル」のリクエストを使用して、ArcView 3.xはArcGISのパンツを打ち負かしますが、レコードに対する明示的なループを含む直接的なテストでは、それがもっともらしいです、どちらか一方は比較的わずかな差で勝つことができます。
whuber

@Whuber @Derek Tharです。
Nathanus

回答:


2

私はプログラミングの初心者ではありませんが、Pythonの初心者なので、これを少しずつお試しください...

copyRecord = arcpy.InsertCursor(outData)

For Nextループの前に挿入カーソルを設定しないでください。「out」データへのパスが「outData」変数に格納されている場合は、反復するたびにリセットする必要はないようです。これで物事が大幅にスピードアップすると思います。


良いキャッチ。来週オフィスにいるときにやってみます。
Nathanus

5

私はあなたがArcPy、または9.3年頃のarcgisscriptingを使用していると想定します。どちらにしても、ここでのテクニックはあなたの処理をスピードアップします...多分あなたの上司より良いでしょう。

最初に、ルックアップを実行し、メモリ以外のメディアを使用して挿入すると、プロセスが遅くなります。Avenueはすばやく動作するように最適化されており、他のほとんどの言語よりもIOが本質的に速いC \ C ++(間違っている場合は修正してください)コードベースを使用しています。Pythonも(ArcPyやarcgisscriptingなどの操作を実行するためにCライブラリにフックする際にオーバーヘッドがある場合を除いて)高速です。

したがって、最初にこれを試してください
。1.メソッドを使用して、使用する必要があるテーブルをメモリにコピーします-

  • gp.CopyFeatures( "path to featureclass \ FeatureclassName"、 "'in_memory' \ FeatureclassName")-フィーチャクラスの場合;
  • gp.CopyRow( "path to featureclass \ FeatureTableName"、 "'in_memory' \ FeatureTableName")-'in_memory'フィーチャクラスまたはテーブルへのテーブル用。

    これにより、RAMディスクのようなメモリを使用できるようになり、ディスクのスラッシングを大幅に節約できます。また、FeatureDatasetパラメータを「in_memory」に置き換えることで、メモリ内にフィーチャクラスまたはテーブルを作成することもできます。

可能な限りPythonコンテナーを使用します。これにより速度も向上します。

最後に、ESRI形式の情報の読み取りと書き込みの効率の順序は次のとおりです。

  1. シェープファイル(悲しいが本当)
  2. パーソナルジオデータベース
  3. ファイルジオデータベース
  4. ArcSDE(直接接続でも遅い)

ここで機能するもののリストをgis.stackexchange.comでコンパイルしようとしているので、これらの提案を試してみてください。ここを参照してください


メモリオプションは便利なようですが、ほぼ1 GBのクロックに対してクエリを実行しているテーブルを組み合わせた可能性があります。これを可能にするのに十分なRAMがあると思いますが、テーブルのサイズが大きすぎると、暴力的なクラッシュの危険がありますか?また、Pythonコンテナとは何ですか?
Nathanus

個人のgdbをファイルgdbよりも速く配置したことに驚いています。これは、私の経験から直接逆転したものです。それをいつどこかで探索することは興味深いでしょう。
マットウィルキー

それは私が現在取り組んでいるプロセスかもしれませんが、ファイルgdbは遅いだけですが、それだけです。私は彼らが標準でいると思います、そして私は純粋にファイルの制限のために個人的なgdbよりもファイルgdbを選択します。このためのベンチマークを考案することに非常に興味があります。いくつかのテストを定義するのを手伝ってくれませんか?
OptimizePrime

シェープファイルをメモリに入れてみましたが、それはほとんど役に立ちませんでした...実際、スクリプトはその後まもなく処理を停止しました。
Nathanus

3

それは、AvenueがPythonより速いということではなく、ArcView3がArcGISよりも速いということです(あなたがしようとしていること)。

その音から、これは本質的に非空間的な演習であるため、dbfpyodbc(自分で試したことがない)などのデータベーステーブルに直接アクセスして(たとえば、arcpyを使用しないで)実験することをお勧めします。個人的に、gdal / ogrスイートのコマンドラインogr2ogrは、arcgisの同等のトランザクションより桁違いに速いことがわかりました。私はOGRクエリ機能に軽く浸しただけで、Pythonバインディングのみを使用して何も構築していないため、その速度が引き継がれるかどうかはわかりません。


ここでの唯一の問題は、非空間データを空間データに追加していることです。IE私はShapeフィールドを他のいくつかと一緒に取り、ジオメトリと追加の非空間データを含む新しいレコードを作成しています。dpfpyとodbcは移動するShapesフィールド(およびそのジオメトリ)を考慮しますか?
Nathanus

Shape.dbfに保存されていないので、シェープファイルでは機能しません。理論的には、odbcを使用してパーソナルジオデータベース(.mdb)で動作する可能性がありますが、特にシェープファイルとパーソナルgdbの両方を既に知っているOGRで実証済みのルートがあるので、私はそのアプローチにはおもしろくないです。
マットウィルキー

1

これは現時点では特に有用な回答ではありませんが、ArcGIS 10.1を待ちます。今年のesri devサミットで、arcpy 10.1カーソルサポートが完全に書き直され、大幅に高速化されたと言われました。プレナリー中に、速度が約8倍に向上したという主張がありました。


情報のおかげで。他に何も期待していません。
Nathanus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.