เมื่อไม่นานมานี้ฉันได้เขียนฟังก์ชั่น Python อย่างรวดเร็วสำหรับการแปลงตารางแอททริบิวไปเป็นพจนานุกรมไพ ธ อนโดยที่คีย์นั้นนำมาจากฟิลด์ ID เฉพาะที่ผู้ใช้ระบุ (โดยทั่วไปคือฟิลด์ OID) นอกจากนี้ตามค่าเริ่มต้นทุกช่องจะถูกคัดลอกไปยังพจนานุกรม แต่ฉันได้รวมพารามิเตอร์ที่อนุญาตให้ระบุเฉพาะชุดย่อย
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 สาขา - ประมาณ 100MB ในฐานข้อมูลไฟล์ทางภูมิศาสตร์ ฟังก์ชั่นนี้ทำงานช้ากว่าที่ฉันคาดไว้มาก: ประมาณ 5-6 นาที (และนี่คือหลังจากคัดลอกตารางไปยังin_memory
พื้นที่ทำงาน) ฉันต้องการหาวิธีเพิ่มความเร็วในการแปลงเป็นพจนานุกรมหรือรับข้อมูลเชิงลึกเกี่ยวกับกลยุทธ์ที่ดีกว่าสำหรับการจัดการข้อมูลแอตทริบิวต์จำนวนมากโดยใช้ Python
UpdateCursors จะทำงานได้ไม่ดีสำหรับฉันเพราะเมื่อมีการเปลี่ยนแปลงแถวหนึ่งมันมีโอกาสที่จะทำให้เกิดการเปลี่ยนแปลงในหลาย ๆ แถว การวนซ้ำและประมวลผลทีละรายการนั้นยุ่งยากเกินไปสำหรับสิ่งที่ฉันต้องการ
subdict = {}
ถึงdel subdict
ทำให้เวลาในการประมวลผลประมาณ 10 วินาที
subdict[field] = row[cursor_fields.index(field)]
นั้นเร็วกว่าการโทรsubdict[field] = row.getValue(field)
หรือไม่ ในสถานการณ์หลังคุณจะต้องดำเนินการหนึ่งขั้นตอน ... แม้ว่าความแตกต่างของประสิทธิภาพระหว่างการทำดัชนีสองรายการ ( cursor_fields
และrow
) และการใช้กระบวนการ ESRI เดียวอาจไม่ดีขึ้นมากและอาจแย่ลงกว่าเดิม!