कुछ समय पहले, मैंने एक विशेषता तालिका को एक अजगर शब्दकोश में परिवर्तित करने के लिए एक त्वरित पायथन फ़ंक्शन लिखा था, जहां कुंजी उपयोगकर्ता द्वारा निर्दिष्ट अद्वितीय आईडी फ़ील्ड (आमतौर पर ओआईडी क्षेत्र) से ली गई है। इसके अतिरिक्त, डिफ़ॉल्ट रूप से सभी फ़ील्ड को शब्दकोश में कॉपी किया जाता है, लेकिन मैंने एक पैरामीटर को शामिल किया है जिसमें केवल एक सबसेट निर्दिष्ट करने की अनुमति है।
def make_attribute_dict(fc, key_field, attr_list=['*']):
dict = {}
fc_field_objects = arcpy.ListFields(fc)
fc_fields = [field.name for field in fc_field_objects if field.type != 'Geometry']
if attr_list == ['*']:
valid_fields = fc_fields
else:
valid_fields = [field for field in attr_list if field in fc_fields]
if key_field not in valid_fields:
cursor_fields = valid_fields + [key_field]
else:
cursor_fields = valid_fields
with arcpy.da.SearchCursor(fc, cursor_fields) as cursor:
for row in cursor:
key = row[cursor_fields.index(key_field)]
subdict = {}
for field in valid_fields:
subdict[field] = row[cursor_fields.index(field)]
dict[key] = subdict
del subdict
return dict
यह अपेक्षाकृत छोटे डेटासेट के लिए बहुत अच्छा काम करता है, लेकिन मैंने इसे एक टेबल पर लगभग 750,000 पंक्तियों और 15 फ़ील्डों के साथ चलाया - एक फ़ाइल जियोडेटाबेस में लगभग 100 एमबी। इन पर, फ़ंक्शन बहुत धीमी गति से चलता है जितना मैंने उम्मीद की होगी: लगभग 5-6 मिनट (और यह in_memory
कार्यक्षेत्र की तालिका की नकल करने के बाद है )। मैं वास्तव में शब्दकोश में रूपांतरण को गति देने का एक तरीका खोजना चाहता हूं, या पायथन का उपयोग करके बड़ी मात्रा में विशेषता डेटा में हेरफेर करने के लिए बेहतर रणनीति पर कुछ अंतर्दृष्टि प्राप्त करना चाहता हूं।
अपडेटसर्कर्स मेरे लिए अच्छा काम नहीं करेंगे, क्योंकि जब एक पंक्ति बदलती है, तो इसमें कई अन्य लोगों में परिवर्तन को ट्रिगर करने की क्षमता होती है। एक बार में उन्हें लूपिंग करना और उन्हें संसाधित करना, जो मुझे चाहिए उसके लिए बहुत बोझिल है।
subdict = {}
माध्यम से लाइनों की टिप्पणी del subdict
।
subdict[field] = row[cursor_fields.index(field)]
की तुलना में कॉलिंग तेज है subdict[field] = row.getValue(field)
। बाद के परिदृश्य में आप एक कदम का प्रदर्शन करेंगे ... हालांकि दो सूचियों ( cursor_fields
और row
) को सूचीबद्ध करने और एक एकल ESRI प्रक्रिया का उपयोग करने के बीच प्रदर्शन में अंतर बहुत बेहतर नहीं हो सकता है और अभी भी बदतर हो सकता है!