ArcView 3.x Avenue บิตแมป (แท็บ) เทียบกับเคอร์เซอร์ ArcView 10 Python


9

หมายเหตุ: ในขณะที่คำถามนี้มีคำตอบเคล็ดลับเพิ่มเติมใด ๆ สำหรับการปรับกระบวนการเคอร์เซอร์ให้เหมาะสมจะได้รับการชื่นชมอย่างมาก ฉันจะตรวจสอบการอัปเดตใด ๆ

ปัจจุบันเจ้านายของฉัน (ที่ทำงานในอเวนิว) และฉัน (ทำงานใน Python) กำลังพยายามแก้ปัญหาเดียวกัน แต่เราทั้งคู่แก้ไขมันได้ แต่ความเร็วที่โซลูชันของเราดำเนินการคือ ... ไม่เชื่อมโยงกันเพื่อพูดอย่างน้อยที่สุด สิ่งที่กระบวนการสคริปต์ของเขาใน 2 ชั่วโมงสามารถขุดได้ถึง 6 ความแตกต่างที่แท้จริงของไวยากรณ์และการใช้งานในตรรกะนั้นมาจาก Bitmaps ของ 3.x และ Cursors 10.x เราทั้งคู่:

1) จัดเก็บค่าจากตารางที่ 1
2) ใช้ค่าเหล่านั้นเพื่อค้นหาแถวในตารางที่ 2
3) จัดเก็บค่าจากตารางที่ 2 สำหรับการแทรกลงในตารางที่ 3 เป็นแถวใหม่

ในสคริปต์ทั้งสองกระบวนการเหล่านี้จะเสร็จสมบูรณ์ในสองลูปซ้อนกัน ก่อนที่ฉันจะเริ่มขุดสู่โลกมหัศจรรย์ของการเพิ่มประสิทธิภาพโค้ดนี่เป็นเหตุการณ์ที่คาดหวังเมื่อเปรียบเทียบประสิทธิภาพสคริปต์ของ 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)

แก้ไข : ได้รับความคิดเห็นบางส่วนจนถึงขณะนี้ฉันสงสัยว่าอาจจะมีวิธีที่ดีกว่าในการทำเช่นนี้ผ่านการเข้าร่วมแม้ว่าฉันจะสงสัยว่าจะได้รับขนาด brobdingnagian (คำพูดประจำวัน!) ของตาราง หัวใจของการประมวลผลคือการผนวกข้อมูลจากตารางหนึ่งไปยังระเบียนที่ตรงกันในตารางที่สองและสร้างตารางที่สามที่มีเขตข้อมูลที่สำคัญเท่านั้น ฉันต้องการลองใช้ SDE แต่ดูเหมือนจะไม่เป็นตัวเลือกที่ใช้ได้ คิด? ฉันขอโทษถ้าคำถามของฉันมีส่วนเกี่ยวข้องอยู่เสมอแต่ฉันพยายามไปที่จุดต่ำสุดของการรบกวนที่ยาวนาน

ตอบแล้ว : คำแนะนำง่ายๆของ Jakub เพียงอย่างเดียวลดเวลาในการประมวลผลจาก30วินาทีต่อ 500 บันทึกเป็น3วินาทีต่อ 500 บันทึก การเริ่มเคอร์เซอร์แทรกใหม่บนทุกเม็ดมีผลทำให้สิ่งต่าง ๆ ช้าลงอย่างเห็นได้ชัด (ชัด) แม้ว่านี่อาจไม่ใช่การปรับให้เหมาะสมที่สุดที่เราสามารถทำได้สำหรับกระบวนการนี้เมื่อเทียบกับความเร็วของ ArcView 3.x แต่ก็เพียงพอสำหรับวัตถุประสงค์ของฉันในเวลานี้ คำแนะนำเพิ่มเติมยินดีต้อนรับมาก!


1
รู้สึกเหมือนโพสต์สคริปต์ของคุณ? ฉันไม่รู้จัก avenue / python ใด ๆ โดยใช้เกณฑ์มาตรฐานของ GP
Derek Swingley

Table Joins and Queries นั้นเร็วกว่า ArcView 3.2 (avenue) เก่ากว่า ArcGIS 8.x ถึง 10 เท่า * arcpy / python โดยทั่วไปเนื่องจากจำนวน (มากขึ้น) ของรหัสในผลิตภัณฑ์ ArcGIS
Mapperz

2
@Mapperz คุณค่อนข้างถูกต้อง อย่างไรก็ตามการประมวลผลแบบแถวต่อแถวใน ArcView 3.x นั้นช้ามากเนื่องจากค่าใช้จ่ายการตีความ 10,000 เท่าสำหรับแต่ละคำขอ เมื่อใครสามารถหลีกเลี่ยงการวนซ้ำได้ - การใช้คำขอ "ระดับสูง" เช่นการรวมและการสืบค้นตามที่คุณแนะนำ - ArcView 3.x จะเอาชนะกางเกงออกจาก ArcGIS แต่เป็นไปได้ว่าในการทดสอบแบบตัวต่อตัวที่เกี่ยวข้องกับการวนรอบอย่างชัดเจน ไม่ว่าจะเป็นคนใดคนหนึ่งสามารถชนะด้วยอัตรากำไรเล็กน้อย
whuber

@Whuber @ ดีเร็กก็เป็นได้
Nathanus

คำตอบ:


2

ฉันไม่ใช่คนใหม่สำหรับการเขียนโปรแกรม แต่เป็นคนใหม่สำหรับ Python ดังนั้นลองหยิบมันดูด้วยเกลือ ...

copyRecord = arcpy.InsertCursor(outData)

ไม่ควรตั้งเคอร์เซอร์แทรกไว้ก่อนหน้าวนรอบถัดไปหรือไม่ ดูเหมือนว่าหากเส้นทางไปยังข้อมูล "out" ถูกเก็บไว้ในตัวแปร "outData" ดังนั้นคุณไม่จำเป็นต้องรีเซ็ตทุกครั้งที่คุณวนซ้ำ ฉันคิดว่าสิ่งนี้ควรเร่งความเร็วสิ่งต่าง ๆ อย่างมีนัยสำคัญ


จับดี. ฉันจะลองดูเมื่อฉันกลับมาที่ออฟฟิศในสัปดาห์หน้า
Nathanus

5

ฉันจะสมมติว่าคุณใช้ ArcPy หรือ arcgisscripting circa 9.3 ไม่ว่าจะด้วยเทคนิคใดก็ตามที่นี่จะทำให้การประมวลผลของคุณเร็วขึ้น .... อาจจะดีกว่าเจ้านายของคุณ

สิ่งแรกคือทำการค้นหาและแทรกด้วยสื่ออื่น ๆ นอกเหนือจากหน่วยความจำจะทำให้กระบวนการของคุณช้าลง อเวนิวได้รับการปรับให้ทำงานได้อย่างรวดเร็วและใช้รหัสฐาน C \ C ++ (แก้ไขฉันถ้าฉันผิด) ซึ่งเป็นมาตรฐานที่ IO เร็วกว่าภาษาอื่น ๆ ส่วนใหญ่ Python นั้นก็รวดเร็วเช่นกัน (เช่นเดียวกับที่รวดเร็ว) ยกเว้นในกรณีที่มีค่าโสหุ้ยในการเชื่อมโยงไปยังไลบรารี c เพื่อดำเนินการเช่น ArcPy หรือ arcgisscripting

ดังนั้นให้ลองสิ่งนี้ก่อน:
1. คัดลอกตารางที่คุณต้องการใช้ลงในหน่วยความจำโดยใช้วิธีการ -

  • gp.CopyFeatures ("เส้นทางไปยัง featureclass \ FeatureclassName", "'in_memory' \ FeatureclassName") - สำหรับคลาสคุณลักษณะและ;
  • gp.CopyRow ("เส้นทางไปยัง featureclass \ FeatureTableName", "'in_memory' \ FeatureTableName") - สำหรับตารางในคลาสหรือตารางคุณลักษณะ 'in_memory'

    สิ่งนี้จะช่วยให้คุณใช้หน่วยความจำเช่นดิสก์ RAM และช่วยให้คุณประหยัดดิสก์ได้มาก คุณยังสามารถสร้างคลาสหรือตารางคุณสมบัติในหน่วยความจำโดยการแทนที่พารามิเตอร์ FeatureDataset ด้วย 'in_memory'

ใช้ภาชนะหลามให้มากที่สุด สิ่งนี้จะเพิ่มความเร็ว

ในที่สุดลำดับของประสิทธิภาพในการอ่านและเขียนข้อมูลสำหรับรูปแบบ ESRI คือ

  1. Shapefile (เศร้า แต่จริง)
  2. Geodatabase ส่วนบุคคล
  3. ไฟล์ Geodatabase
  4. ArcSDE (แม้การเชื่อมต่อโดยตรงจะช้ากว่า)

ให้คำแนะนำเหล่านี้ลองขณะที่ฉันพยายามรวบรวมรายการสิ่งที่ทำงานที่นี่ใน gis.stackexchange.com ดูที่นี่


ดูเหมือนว่าตัวเลือกหน่วยความจำมีประโยชน์ แต่ความสามารถในการรวมกันของตารางที่ฉันทำกับนาฬิกาในเกือบ 1 gb ฉันเชื่อว่าฉันมี RAM เพียงพอที่จะทำให้สิ่งนี้เป็นไปได้ แต่ขนาดของตารางที่แท้จริงจะมีความเสี่ยงสูงหรือไม่ นอกจากนี้คอนเทนเนอร์ไพ ธ อนคืออะไร?
Nathanus

ฉันประหลาดใจที่คุณวาง gdb ส่วนบุคคลให้เร็วกว่าไฟล์ gdb เนื่องจากมันกลับด้านจากประสบการณ์ของฉันโดยตรง มันจะน่าสนใจที่จะสำรวจว่าที่ไหนสักแห่ง / เวลา
แมตต์วิลคี

อาจเป็นกระบวนการที่ฉันใช้งานอยู่ในขณะนี้ แต่ฉันพบว่าไฟล์ gdb นั้นช้ากว่า แต่มีเพียงแค่เท่านั้น ฉันว่าพวกเขาอยู่เสมอและฉันเลือกไฟล์ gdb มากกว่า gdb ส่วนตัวเพราะข้อ จำกัด ของไฟล์ ฉันสนใจที่จะกำหนดเกณฑ์มาตรฐานสำหรับสิ่งนี้ คุณสนใจที่จะช่วยฉันกำหนดการทดสอบบางอย่างหรือไม่?
OptimizePrime

ฉันพยายามวาง shapefile ไว้ในหน่วยความจำและดูเหมือนว่าจะช่วยได้น้อยมาก ... จริง ๆ แล้วสคริปต์หยุดประมวลผลในไม่ช้าหลังจากนั้น
Nathanus

3

ฉันพนันได้เลยว่า Avenue นั้นเร็วกว่า Python แต่ ArcView3 นั้นเร็วกว่า ArcGIS (ในสิ่งที่คุณพยายามจะทำ)

เนื่องจากจากเสียงของมันนี่เป็นแบบฝึกหัดที่ไม่มีเชิงพื้นที่คุณอาจต้องการทดสอบกับการเข้าถึงตารางฐานข้อมูลโดยตรง (เช่นไม่ใช้ arcpy) กับสิ่งที่ต้องการdbfpyหรือodbc (ยังไม่ได้ลองด้วยตัวเอง) ส่วนตัวผมได้พบ commandline ogr2ogrของGDAL / OGRชุดจะเป็นคำสั่งของขนาดได้เร็วกว่าการทำธุรกรรมเทียบเท่าใน ArcGIS ฉันจุ่มความสามารถในการสืบค้น OGR ลงไปเพียงเล็กน้อยและฉันไม่ได้สร้างอะไรเลยโดยใช้การผูก python เท่านั้นดังนั้นฉันจึงไม่ทราบว่าความเร็วนั้นมีอยู่หรือไม่


ถูที่นี่เพียงอย่างเดียวคือฉันกำลังผนวกข้อมูลที่ไม่ใช่เชิงพื้นที่กับข้อมูลเชิงพื้นที่ IE ฉันกำลังนำShapeฟิลด์นี้ไปพร้อมกับคนอื่น ๆ และสร้างระเบียนใหม่ที่จะมีรูปทรงเรขาคณิตและข้อมูลที่ไม่ใช่เชิงพื้นที่เพิ่มเติม บัญชี dpfpy และ odbc สำหรับย้ายShapesฟิลด์ (และรูปทรงเรขาคณิต) หรือไม่
Nathanus

มันจะไม่ทำงานกับ shapefiles เนื่องจากShapeไม่ได้เก็บไว้ใน. dbf ในทางทฤษฎีมันสามารถทำงานกับฐานข้อมูลส่วนบุคคลทางภูมิศาสตร์ (.mdb) โดยใช้ odbc ได้ แต่ฉันเข้าใจวิธีการนั้นโดยเฉพาะอย่างยิ่งเนื่องจากมีเส้นทางที่พิสูจน์แล้วด้วย OGR ซึ่งรู้ทั้งรูปร่างไฟล์และ gdb ส่วนบุคคลอยู่แล้ว
matt wilkie

1

นี่ไม่ใช่คำตอบที่มีประโยชน์เป็นพิเศษในขณะนี้ แต่รอ ArcGIS 10.1 ในการประชุมสุดยอด esri dev ปีนี้เราได้รับแจ้งว่าการสนับสนุนเคอร์เซอร์ 10.1 arcpy ได้รับการเขียนใหม่อย่างสมบูรณ์และเร็วกว่ามาก ในช่วงที่สมบูรณ์มีการเรียกร้องของการปรับปรุงความเร็วประมาณ 8x


ขอบคุณสำหรับข้อมูล. สิ่งที่คาดหวังถ้าไม่มีอะไรอื่น
Nathanus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.