কিছুক্ষণ আগে, আমি অজগর অভিধানে একটি অ্যাট্রিবিউট টেবিল রূপান্তর করার জন্য একটি দ্রুত পাইথন ফাংশন লিখেছিলাম, যেখানে কীটি ব্যবহারকারী-নির্দিষ্ট অনন্য আইডি ক্ষেত্র (সাধারণত ওআইডি ক্ষেত্র) থেকে নেওয়া হয়। অতিরিক্তভাবে, ডিফল্টরূপে সমস্ত ক্ষেত্র অভিধানে অনুলিপি করা হয়, তবে আমি একটি পরামিতি অন্তর্ভুক্ত করেছি যাতে কেবল একটি উপসেট নির্দিষ্ট করা যায়।
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
প্রায় 10 সেকেন্ডের একটি প্রক্রিয়াকরণের উৎপাদ।
subdict[field] = row[cursor_fields.index(field)]
কলিং চেয়ে দ্রুত subdict[field] = row.getValue(field)
। পরের দৃশ্যে আপনি এক ধাপ সম্পাদন করবেন ... যদিও দুটি তালিকাকে তালিকাভুক্ত করা ( cursor_fields
এবং row
) এবং একক ইএসআরআই প্রক্রিয়া ব্যবহারের মধ্যে পারফরম্যান্সের পার্থক্য খুব ভাল নাও হতে পারে এবং আরও খারাপ হতে পারে!