วิธีปรับปรุงประสิทธิภาพเมื่อใช้เคอร์เซอร์ ArcGIS ใน Python กับตารางขนาดใหญ่


10

ฉันมีคลาสฟีเจอร์จุดใหญ่ในไฟล์ฐานข้อมูลภูมิศาสตร์ (~ 4 000 000 บันทึก) นี่เป็นตารางคะแนนปกติที่มีความละเอียด 100 ม.

ฉันต้องทำการวางแนวทั่วไปบนเลเยอร์นี้ สำหรับสิ่งนี้ฉันสร้างกริดใหม่โดยที่แต่ละจุดอยู่ตรงกลางของจุด 4 "เก่า":

 *     *     *     *
    o     o     o
 *     *     *     *
    o     o     o
 *     *     *     *

[*] = จุดของตารางเดิม - [o] = จุดของตารางใหม่

ค่าแอททริบิวของแต่ละจุดใหม่จะคำนวณตามค่าน้ำหนักของ 4 เพื่อนบ้านในกริดเก่า ฉันวนรอบทุกจุดของกริดใหม่ของฉันและสำหรับแต่ละจุดฉันวนรอบทุกจุดบนกริดเก่าของฉันเพื่อค้นหาเพื่อนบ้าน (โดยการเปรียบเทียบค่าของ X และ Y ในตารางคุณลักษณะ) เมื่อพบ 4 เพื่อนบ้านแล้วเราก็ออกไปจากวง

ไม่มีความซับซ้อนของระเบียบวิธีที่นี่ แต่ปัญหาของฉันคือว่าจากการทดสอบครั้งแรกของฉันสคริปต์นี้จะใช้เวลานานหลายสัปดาห์เพื่อให้เสร็จสมบูรณ์ ...

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

  • จัดทำดัชนีฟิลด์ X และ Y => ฉันทำเช่นนั้น แต่ไม่ได้สังเกตเห็นการเปลี่ยนแปลงประสิทธิภาพที่สำคัญ
  • ใช้เคียวรีเชิงพื้นที่เพื่อค้นหาเพื่อนบ้านไม่ใช่แบบอิงแอตทริบิวต์ มันจะช่วยได้จริงหรือ ฟังก์ชันเชิงพื้นที่ใน ArcGIS ควรทำงานอย่างไร ฉันสงสัยว่าเช่นการบัฟเฟอร์แต่ละจุดใหม่จะพิสูจน์ได้ว่ามีประสิทธิภาพมากขึ้น
  • แปลงคลาสคุณลักษณะเป็น NumPy Array จะช่วยได้ไหม ฉันยังไม่ได้ทำงานกับ NumPy มากนักและฉันก็ไม่อยากดำดิ่งลงไปจนกว่าจะมีคนบอกฉันว่ามันอาจช่วยลดเวลาในการประมวลผลได้
  • มีอะไรอีกไหม

คุณใช้ Arcmap รุ่นใดอยู่
Martin

คุณพิจารณา PostGIS หรือไม่ นั่นคือตัวเลือกหรือไม่?
ชาดคูเปอร์

ขออภัยที่ฉันลืมไปนั้น: ArcGIS 10.1 // Python 2.7
Stéphane Henriod

Nope, PostGIS น่าเสียดายที่ไม่ใช่ตัวเลือกมือของฉันถูกผูกติดอยู่ที่นี่ ... ที่ดีที่สุดที่ฉันสามารถใช้ Oracle กับฟังก์ชั่น SDE
Stéphane Henriod

คำตอบ:


13

เกิดอะไรขึ้นถ้าคุณป้อนคะแนนลงในอาเรย์ numpy และใช้ cKDTree scipy เพื่อค้นหาเพื่อนบ้าน ฉันประมวลผล LiDAR point clouds ด้วยคะแนนจำนวนมาก (> 20 ล้าน) ในหลายนาทีโดยใช้เทคนิคนี้ มีเอกสารประกอบที่นี่สำหรับ kdtree และที่นี่สำหรับการแปลงที่ไม่เจาะจง โดยทั่วไปคุณอ่าน x, y ในอาร์เรย์และวนซ้ำในแต่ละจุดในอาร์เรย์เพื่อหาดัชนีของจุดภายในระยะที่กำหนด (ย่าน) ของแต่ละจุด คุณสามารถใช้ดัชนีเหล่านี้เพื่อคำนวณคุณสมบัติอื่น ๆ


คำตอบนี้ดีกว่าของฉัน
radouxju

ฉันชอบความคิดนี้ แต่ฉันไม่มี scipy บนเวิร์กสเตชันที่ฉันกำลังทำงานอยู่ (และไม่มีสิทธิ์ของผู้ดูแลระบบ) หากฉันจัดการเพื่อติดตั้งแพ็กเกจนี้ฉันจะลองดู
Stéphane Henriod

4

ฉันอยู่กับ Barbarossa ... เคอร์เซอร์ของ arcpy นั้นอ่อนแออย่างบ้าคลั่งดังนั้นฉันจึงใช้มันเพื่อสำรวจตารางหรือฟีเจอร์คลาสหนึ่งครั้งเท่านั้น หากฉันไม่สามารถทำงานให้เสร็จภายในหนึ่งรอบฉันจะใช้เคอร์เซอร์เพื่อเติมโครงสร้างข้อมูลชนิดอื่นและทำงานกับมัน

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

ในขั้นตอนที่สองคุณสามารถรับค่าที่คุณต้องการในการคำนวณจุดได้ง่ายๆโดยการรับค่าจากพจนานุกรมของคุณ (ซึ่งรวดเร็วอย่างไม่น่าเชื่อเพราะพจนานุกรม hashindex ของรายการ)


จริง ๆ แล้วฉันชอบความคิดของคุณที่มีพจนานุกรมและฉันเพิ่งใช้มัน มันใช้งานได้ดีกว่าจริง ๆ ... จนกว่าฉันจะเขียนผลลัพธ์ด้วย row.insertRow () ... ความคิดใดที่ฉันสามารถปรับปรุงส่วนนี้ได้เช่นกัน?
Stéphane Henriod

ฉันมีปัญหาคล้ายกันซึ่งฉันต้องเลือก 10.000 คะแนนจาก 14 Mio แล้วลบมัน arcpy.cursors ซึ่งสามารถลบได้เพียงประมาณ 1 หรือ 2 คะแนนต่อวินาที (!) ดังนั้นฉันจึงติดตั้งโมดูล pyodbc เพื่อลบออกด้วยคำสั่ง SQL DELETE เดียวในเวลาเพียงหนึ่งวินาที การอัปเดตผ่าน SQL จะทำให้คุณได้รับการปรับปรุงมากขึ้นตราบใดที่คุณเพียงต้องการปรับเปลี่ยนแอตทริบิวต์ ... อย่างไรก็ตามคุณจะต้องติดตั้งโมดูลหลามเพิ่มเติม ... แต่ก็คุ้มค่า
Jürgen Zornig

2

สำหรับกริดปกติมันควรจะมีประสิทธิภาพมากกว่าในการทำงานในรูปแบบแรสเตอร์ แปลงกริดแรกของคุณให้เป็นแรสเตอร์คุณสามารถ resample ที่ความละเอียดเดียวกันโดยใช้เครื่องมือแก้ไข bilinear แต่เปลี่ยนภาพเอาต์พุตของคุณเป็น 1/2 พิกเซลใน X และ Y และกลับมาที่จุดอีกครั้งถ้าคุณยังต้องมีคะแนน

แก้ไข: สำหรับกฎการตัดสินใจที่ซับซ้อนคุณสามารถแปลงแต่ละฟิลด์ที่คุณต้องการเป็นแบนด์แรสเตอร์ใหม่จากนั้นคุณสร้างสำเนาของวงเหล่านั้นสี่ชุดและเปลี่ยนแรสเตอร์ใน 4 ทิศทาง 1/2 พิกเซล (+50, - 50), (+50, + 50), (-50, -50) และ (-50, + 50) จากนั้นคุณสามารถใช้พีชคณิตแผนที่ปกติ


ขอบคุณฉันคิดเกี่ยวกับวิธีแก้ปัญหานี้จริง ๆ แต่ฉันไม่แน่ใจว่า / ฉันสามารถใช้การคำนวณค่าใหม่ได้อย่างไรในรูปแบบแรสเตอร์ ให้ฉันอธิบาย: สำหรับแต่ละจุดใหม่ (หรือเซลล์แรสเตอร์ใหม่) ฉันต้องการคำนวณค่าของมันเช่น: ฉันรับค่าของแต่ละเพื่อนบ้าน ค่าเหล่านั้นแต่ละค่ามีความน่าจะเป็นที่จะให้ค่าเฉพาะกับจุดใหม่ เช่นหากเพื่อนบ้านหนึ่งคนมีค่า 202 ก็จะให้ค่า 3 (มีน้ำหนัก 1) หรือค่า 11 (มีน้ำหนัก 5) จากนั้นเราก็สรุปให้กับเพื่อนบ้านทั้ง 4 คนและหาค่าใหม่ ... ไม่แน่ใจว่านี่ชัดเจนมาก ...
Stéphane Henriod

PS: การคำนวณเพื่อค้นหาค่าใหม่สามารถในบางกรณีขึ้นอยู่กับ 2 คุณลักษณะไม่ใช่เพียงหนึ่งซึ่งอาจทิ้งวิธี Raster
Stéphane Henriod

สำหรับผลรวมถ่วงน้ำหนักของคุณคุณเพียงแค่ต้องการสอง rasters: หนึ่งที่คุณ resample ผลิตภัณฑ์ของน้ำหนักและค่าที่สองที่คุณ resample น้ำหนักเท่านั้น หากคุณหารแรกด้วยสองคุณจะได้รับผลรวมถ่วงน้ำหนัก
radouxju

1
@ StéphaneHenriod - เป็นข้อเสนอแนะคุณอาจพิจารณาแก้ไขคำถามเพื่อเพิ่มข้อกำหนดเพิ่มเติมเหล่านี้ จากคำถามแรกฉันคิดว่าคำตอบนี้สมเหตุสมผล แต่ด้วยข้อมูลใหม่คำตอบของ Barbarossa นั้นดูดี
nicksan

2

ขอบคุณทุกคนสำหรับความช่วยเหลือของคุณ!

ในที่สุดฉันก็พบวิธีที่ไม่ต้องใช้เวลามากในการแก้ปัญหานี้ ... สิ่งที่ใช้เวลาในการคำนวณมากที่สุดคือการค้นหาเพื่อนบ้านทั้งสี่ของแต่ละจุด แทนที่จะใช้ X และแอตทริบิวต์ Y (ทั้งที่มีเคอร์เซอร์ arcpy หรือภายในโครงสร้างข้อมูลอื่นเช่น ditionary หลาม) ผมจบลงด้วยการใช้เครื่องมือ ArcGIS สร้างตารางที่อยู่ใกล้กับ ฉันคิดว่านี่ใช้ประโยชน์จากดัชนีเชิงพื้นที่และการแสดงนั้นสูงกว่ามากโดยที่ฉันไม่ต้องทำดัชนีเอง


0

ปัญหาเกี่ยวกับเคอร์เซอร์คือคุณสามารถวนรอบพวกมันได้ในทางเดียวเท่านั้นและคุณไม่สามารถย้อนกลับไปได้ แม้ว่าจะไม่แนะนำก็ตามคุณสามารถใส่ค่า feautres ไว้ในโครงสร้างได้หากคุณวางแผนที่จะกลับมาใช้อีกครั้ง

หากคุณสามารถประมวลผลคุณสมบัติของคุณได้ในวงเดียวฉันขอแนะนำให้เปิดใช้งานการรีไซเคิล มันเป็นพารามิเตอร์ในฟังก์ชั่นการค้นหาของคุณ classclass ที่อนุญาตให้ไพ ธ อนใช้หน่วยความจำที่จัดสรรโดยฟีเจอร์เก่าและทำการข้ามคุณสมบัติในเคอร์เซอร์เร็วขึ้น คุณสามารถประมวลผลกริดของคุณได้เร็วขึ้น 80%

ปัญหาคือคุณไม่สามารถเปิดใช้งานการรีไซเคิลได้หากคุณวางแผนที่จะจัดเก็บคุณสมบัติที่ดึงมาจากเคอร์เซอร์


ฉันต้องการสำรวจเรื่อง "เคอร์เซอร์รีไซเคิล" แต่ไม่พบเอกสารใด ๆ เกี่ยวกับความช่วยเหลือของ ESRI คุณมีลิงค์หรือไม่? Search Cursor ไม่มีพารามิเตอร์รีไซเคิล Select_by_Attribute ไม่มีพารามิเตอร์ดังกล่าว ฉันไม่เห็นอะไรเลยใน ENV
klewis

ฉันเขียนบทความสักครู่กลับhusseinnasser.com/2009/08/when-to-use-recycling-cursor.html?m=1
hnasr

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