ArcGIS पायथन सर्चकॉसर फ़ाइल लॉकिंग?


11

मेरे पास एक स्क्रिप्ट है जो उपयोगकर्ता को वापस करने के लिए किसी आकृति वाले क्षेत्र से मान प्राप्त करती है।

ऐसा लगता है कि केवल जब arcpy.SearchCursor को ArcMap 10.0 कहा जाता है, तो फ़ाइल लॉक हो जाती है और स्क्रिप्ट के समाप्त होने के बाद इसे हटाया नहीं जाता है। लॉक बंद करने के लिए मुझे आर्कपॉज़ को बंद करना होगा। स्क्रिप्ट में मैं इसे सर्च करने के बाद SearchCursor ऑब्जेक्ट को और साथ ही रो ऑब्जेक्ट को हटाता हूं।

जिस तरह से मेरे पास स्क्रिप्ट काम कर रही है वह यह है कि यह बाद के रन पर कार्यक्षेत्र फ़ोल्डर को हटाने की कोशिश करता है, लेकिन लॉक के कारण नहीं हो सकता ... जब तक मैं आर्कपैक बंद नहीं करता।

क्या इस ताला को हटाने की कोई सलाह है?

जवाबों:


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

देखें पायथन स्क्रिप्ट में बनाई गई फाइल जियोडेटाबेस और फीचर क्लास पर लॉक से छुटकारा नहीं मिल सकता है । यह एक ही मुद्दे की तरह दिखता है। मैंने फीचर क्लास को स्पष्ट रूप से हटाने से पहले इसके चारों ओर घूम लिया है। मुझे यकीन नहीं है कि यह सभी मामलों में काम करेगा।

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)

एक कचरा संग्रह के लिए मजबूर करने के रूप में अच्छी तरह से काम कर सकते हैं, लेकिन मेरा कूबड़ यह है कि यह चापलूसी या आर्कपाइप के आंतरिक कामकाज के साथ कुछ करना है।

import gc
gc.collect()

मैंने इसे संपादित किया है, क्योंकि कर्सर के प्रत्येक पुनरावृत्ति के बाद पंक्ति संदर्भ को हटा दिया जाना चाहिए, अन्यथा लूप के बाहर कॉल शानदार है। यह एक ऐसा भी है जिसे मैंने वोट दिया था क्योंकि मैं एक ही मुद्दे के आसपास हो सकता था जब मेरे पास था।
बालों

@ हर्ष ठीक है, लेकिन मुझे लगता है कि यह एक मूक बिंदु है। जब एक नई पंक्ति वस्तु को पंक्ति चर को सौंपा जाता है, तो पायथन प्रत्येक पुनरावृत्ति पर पिछली पंक्ति वस्तु के संदर्भों को घटाता है । लूप के बाद बस अंतिम पंक्ति असाइनमेंट को साफ करता है। इसे लूप के अंदर ले जाना प्रयास का दोहराव है। किसी भी स्थिति में, कचरा संग्रहकर्ता को मेमोरी को तब तक हटा देना चाहिए जब तक कि आर्कपी या आर्कपपर्स आंतरिक रूप से पंक्ति वस्तुओं के संदर्भ में न हो जाए। row = None
थार्न

असहमत सहमत होने के लिए ठीक है, या यह एक मूक बिंदु है। मुझे पता है कि चापलूसी में कचरा संग्रह त्रुटिपूर्ण है, और यदि आप इसे बंद कर देते हैं तो वास्तव में बहुत तेज है। के रूप में पंक्ति के लिए पंक्ति में कुछ भी नहीं करने के लिए सेट किया जा रहा है, मुझे पता है कि यह उस तरह से बेहतर काम करता है। कुछ कहेंगे कि किसी को भी कुछ भी स्थापित करना बहुत ही शानदार है, लेकिन ऐसा नहीं है। अपनी स्क्रिप्ट की शुरुआत में अपना कचरा संग्रह बंद करने पर जाएं और समय के अंतर को मापें। मैं भी डेल रो का उपयोग करता हूं, न कि पंक्ति = कोई भी नहीं, लेकिन यह एक और धमाका है: आयात gc gddisable () की कोशिश करें
बालों वाली

@ हर्ष, यह मुझे अक्षम करने के लिए नहीं था gc। मै उसे करने की एक कोशिश तो करूंगा।
थार्न

यह मेरे लिए काम नहीं करता क्योंकि मुझे फीचर क्लास की जरूरत है। इसके अलावा, मुझे बाद में एक अन्य फीचर क्लास में एक अपडेटसर्वर मिलता है और यह भी लॉक हो जाता है। मैं दर्पण का उपयोग करके समाप्त हो गया और जहां मुझे होने की आवश्यकता है, वहां पाने के लिए हाथ की चिकनाई। निश्चित नहीं है कि यह कब तक रहेगा। धन्यवाद।
जस्टिन

1

क्या आपको ArcMap के अंदर से अपनी ArcPy स्क्रिप्ट को चलाने की आवश्यकता है? जब तक यह आपके द्वारा बनाए गए इंटरफ़ेस या टूलबॉक्स का हिस्सा नहीं है, आप इसे आर्कन के बाहर पायथन कंसोल, आईडीएलई, या एक्लिप्स आदि से चला सकते हैं (इसलिए जब तक आपके पास मशीन पर चलने वाला उपयुक्त लाइसेंस हो)। यदि यह मामला है तो आप अपने आर्क स्क्रिप्ट को उपप्रोसेस के रूप में लिखने के लिए थोड़ा पायथन कोड लिख सकते हैं और उपप्रकार बंद होने पर लॉक को जारी किया जाना चाहिए।

ArcGIS ताले एक दर्द है। मेरे पास ऐसी परिस्थितियां हैं जहां मशीन को बंद करने के बाद भी एक ताला बना रहता है, जो एक स्मारकीय दर्द है (आमतौर पर अगर आर्क ताले को साफ करने से पहले दुर्घटनाग्रस्त हो जाता है)। अंतिम उपाय के रूप में, यदि ऐसा होता है, तो .LOCK फ़ाइल को खोजने के लिए विंडोज एक्सप्लोरर का उपयोग करें और इसे मैन्युअल रूप से हटा दें। यह काम नहीं करेगा अगर यह आर्कपाइप या पायथन प्रक्रिया द्वारा एक्सेस किया जा रहा है, तो यह अपेक्षाकृत सुरक्षित है ... लेकिन यह वास्तव में गेट-आउट-जेल कार्ड है और अच्छा अभ्यास नहीं है :)


1

यदि आप पंक्ति और कर्सर ऑब्जेक्ट (जैसे del row, rows) और लॉक दोनों को ठीक से हटा रहे हैं , तो यह संभव है, क्योंकि आर्कपेज़ स्वयं, आर्कपी नहीं है, फिर भी इसे संदर्भित कर रहा है।

क्या आकृति तालिका को सामग्री की तालिका में एक परत द्वारा संदर्भित किया जाता है, या क्या इसे आपके स्क्रिप्ट टूल द्वारा TOC में जोड़ा जाता है?

यदि बाद में, आप आर्कबॉपर में जियोप्रोसेसिंग-> जियोप्रोसेसिंग विकल्पों के तहत "प्रदर्शन में जियोप्रोसेसिंग ऑपरेशन के परिणाम जोड़ें" को अक्षम करने का प्रयास कर सकते हैं ।

एक अतिरिक्त सुझाव: यदि आप इसे अस्थायी / मध्यवर्ती डेटासेट के रूप में कर रहे हैं, और सुविधाओं की संख्या बहुत बड़ी नहीं है, तो in_memoryपूरी तरह से लॉकिंग समस्या के चारों ओर पाने के लिए कार्यक्षेत्र का उपयोग करने का प्रयास करें और एक अच्छा संभावित प्रदर्शन वृद्धि प्राप्त करें। ।

स्क्रिप्ट से बाहर निकलने से पहले डिलीट (डेटा मैनेजमेंट) का उपयोग करके__मोरी वर्कस्पेस या आपके द्वारा बनाए गए विशिष्ट डेटासेट को हटाना सुनिश्चित करें , अन्यथा यह एप्लिकेशन बंद होने तक मेमोरी में रहना जारी रखेगा।

अंत में, मैं यह भी नोट करूंगा कि जब आप सामग्री की तालिका से एक परत हटाते हैं, तो लॉक फ़ाइलों को न हटाकर 10.0 में बदल जाने वाला आकार-निर्धारण लॉकिंग व्यवहार अधिक सख्त हो जाता है। इस लेख और इस संबंधित प्रश्न को भी देखें ।


यह निश्चित रूप से ArcMap है। मुझे लगता है कि कॉलिंग कर्सर पिछले कर्सर को मारता है। मैं fc पर एक SearchCursor को कॉल करता हूं .. फिर एक और fc पर एक UpdateCursor और पिछले लॉक चला जाता है। मैं एक फ़ाइल पर एक थ्रिल डमी कर्सर कह सकता हूं जिसे केवल लॉक किलिंग ब्लैक बॉक्स शैली को संभालने के लिए हटाने की आवश्यकता नहीं होगी। धन्यवाद।
जस्टिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.