การล็อคไฟล์ ArcGIS Python SearchCursor?


11

ฉันมีสคริปต์ที่ได้รับค่าจากเขตข้อมูลของ shapefile เพื่อกลับไปที่ผู้ใช้

ดูเหมือนว่าเฉพาะเมื่อ arcpy.SearchCursor เรียกว่า ArcMap 10.0 ล็อคไฟล์และจะไม่ถูกลบหลังจากสคริปต์ทำงานเสร็จ เพื่อปิดล็อคฉันต้องปิด ArcMap ในสคริปต์ฉันลบวัตถุ SearchCursor หลังจากใช้งานเช่นเดียวกับวัตถุแถว

วิธีที่ฉันใช้งานสคริปต์ก็คือพยายามที่จะลบโฟลเดอร์เวิร์กสเปซในการทำงานครั้งต่อไป แต่ไม่สามารถทำได้เพราะล็อค ... จนกว่าจะปิด ArcMap แน่นอน

มีคำแนะนำใด ๆ ในการทำให้ล็อคนี้หายไปหรือไม่?

คำตอบ:


4

ปัญหาได้รับการแก้ไขหลังจากไปจาก:

rows = arcpy.UpdateCursor(fc)   
delete = rows.deleteRow  
for row in rows:  
    delete(row)  
del row  
del rows

ถึง

rows = arcpy.UpdateCursor(fc)
for row in rows:
    rows.deleteRow(row)
del row
del rows

3

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

import arcpy

fcPath = 'c:/temp/features.shp'
idFld = 'OBJECTID'
cur = arcpy.SearchCursor(fcPath)
for row in cur:
    id = row.getValue(idFld)
    row = None
cur = None
r = arcpy.Delete_management(fcPath)

print r.getOutput(0)

การบังคับให้มีการรวบรวมขยะอาจทำงานได้เช่นกัน แต่ลางสังหรณ์ของฉันคือสิ่งนี้เกี่ยวข้องกับการทำงานภายในของ arcpy หรือ ArcMap

import gc
gc.collect()

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

@ Fairy ตกลง แต่ฉันคิดว่ามันเป็นจุดปิด งูหลาม decrements การอ้างอิงไปยังแถวก่อนหน้าวัตถุในแต่ละซ้ำเมื่อแถวใหม่วัตถุได้รับมอบหมายให้แถวตัวแปร row = Noneหลังจากลูปเพียงล้างการกำหนดแถวสุดท้าย การย้ายเข้าไปในลูปเป็นการทำซ้ำของความพยายาม ไม่ว่าในกรณีใด ๆ ตัวรวบรวมขยะควรยกเลิกการจัดสรรหน่วยความจำเว้นแต่ว่า arcpy หรือ ArcMap จะทำการอ้างอิงอ้างอิงไปยังวัตถุแถว
tharen

มันตกลงที่จะเห็นด้วยที่จะไม่เห็นด้วยหรือมันเป็นจุดที่สงสัย ฉันรู้ว่าการรวบรวมขยะในอาร์คีมีข้อบกพร่องและจริง ๆ แล้วเร็วกว่ามากถ้าคุณปิด สำหรับแถวที่ถูกกำหนดให้ไม่มีอะไรในแถวฉันรู้ว่ามันทำงานได้ดีขึ้น บางคนบอกว่าการตั้งค่าสิ่งใดเป็นไม่มีเลยเป็นเรื่องฟุ่มเฟือย แต่ไม่ใช่ ลองปิดการเก็บขยะของคุณในตอนเริ่มต้นสคริปต์และวัดความแตกต่างของเวลา ฉันยังใช้แถว del ไม่ใช่แถว = none แต่นั่นเป็นอีกปัญหาหนึ่ง: ลองนำเข้า gc gc.disable ()
ขน

@ นางฟ้ามันไม่ได้เกิดขึ้นกับฉันที่จะปิดการใช้งาน gc ฉันจะลองดู
tharen

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

1

คุณจำเป็นต้องเรียกใช้สคริปต์ ArcPy ของคุณจากภายใน ArcMap หรือไม่? ยกเว้นว่าเป็นส่วนหนึ่งของอินเทอร์เฟซหรือกล่องเครื่องมือที่คุณสร้างคุณสามารถเรียกใช้ภายนอก ArcMap จากคอนโซล Python, IDLE หรือ Eclipse เป็นต้น (ตราบใดที่คุณมีใบอนุญาตที่เหมาะสมในเครื่องที่ทำงานอยู่) หากเป็นกรณีนี้คุณสามารถเขียนรหัส Python เล็ก ๆ น้อย ๆ เพื่อวางไข่สคริปต์ ArcPy ของคุณเป็น subprocess และการล็อคควรได้รับการปล่อยตัวเมื่อ subprocess ปิด

ล็อค ArcGIS เป็นความเจ็บปวด ฉันเคยมีสถานการณ์ที่ล็อคยังคงอยู่แม้หลังจากปิดเครื่องซึ่งเป็นความเจ็บปวดที่ยิ่งใหญ่ (โดยปกติถ้าอาร์คขัดข้องก่อนที่มันจะเป็นระเบียบเรียบร้อยล็อค) หากเป็นกรณีสุดท้ายให้ใช้ Windows Explorer เพื่อค้นหาไฟล์. Lock และลบด้วยตนเอง สิ่งนี้จะไม่ทำงานหากมีการเข้าถึงโดย ArcMap หรือกระบวนการ Python ดังนั้นจึงค่อนข้างปลอดภัย ... แต่นี่เป็นการ์ด Get-Out-of-Jail จริงๆและไม่ใช่วิธีที่ดี :)


1

หากคุณลบทั้งวัตถุแถวและเคอร์เซอร์อย่างถูกต้อง (เช่นdel row, rows) และล็อคยังคงเป็นไปได้ว่ามันเป็นเพราะ ArcMap เองไม่ใช่ arcpy ยังคงอ้างอิงอยู่

Shapefile อ้างอิงโดยเลเยอร์ในสารบัญหรือเพิ่มลงใน TOC ด้วยเครื่องมือสคริปต์ของคุณหรือไม่

หากหลังคุณอาจลองปิดการใช้งาน"เพิ่มผลลัพธ์ของการดำเนินการประมวลผลทางภูมิศาสตร์ไปยังจอแสดงผล"ภายใต้ตัวเลือกประมวลผลทางภูมิศาสตร์ -> ตัวเลือกการประมวลผลทางภูมิศาสตร์ใน ArcMap

ข้อเสนอแนะเพิ่มเติม:ถ้าคุณทำเช่นนี้เป็นชุดข้อมูลชั่วคราว / กลางและจำนวนของคุณสมบัติไม่ใหญ่เกินไปลองใช้in_memoryพื้นที่ทำงานแทนแฟ้มข้อมูลเพื่อหลีกเลี่ยงปัญหาการล็อคโดยสิ้นเชิงและเพิ่มประสิทธิภาพที่ดีเช่นกัน .

เพียงให้แน่ใจว่าได้ลบพื้นที่ทำงาน in_memory หรือชุดข้อมูลเฉพาะที่คุณสร้างขึ้นโดยใช้Delete (การจัดการข้อมูล)ก่อนที่จะออกจากสคริปต์มิฉะนั้นมันจะยังคงอยู่ในหน่วยความจำจนกว่าแอปพลิเคชันจะปิด

สุดท้ายฉันก็จะทราบว่าพฤติกรรมการล็อค shapefile เปลี่ยนไปใน 10.0 เพื่อเข้มงวดมากขึ้นโดยไม่ลบไฟล์ล็อคเมื่อคุณลบเลเยอร์จากสารบัญ ดูบทความนี้และคำถามที่เกี่ยวข้องนี้


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