Cách đây một thời gian, tôi đã viết một hàm Python nhanh để chuyển đổi bảng thuộc tính thành từ điển python, trong đó khóa được lấy từ trường ID duy nhất do người dùng chỉ định (thường là trường OID). Ngoài ra, theo mặc định, tất cả các trường được sao chép vào từ điển, nhưng tôi đã bao gồm một tham số cho phép chỉ một tập hợp con được chỉ định.
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
Điều này hoạt động rất tốt cho các bộ dữ liệu tương đối nhỏ, nhưng tôi chỉ chạy nó trên một bảng chứa khoảng 750.000 hàng và 15 trường - khoảng 100 MB trong một cơ sở dữ liệu địa lý tệp. Về những điều này, chức năng chạy chậm hơn nhiều so với tôi dự kiến: khoảng 5-6 phút (và đây là sau khi sao chép bảng vào in_memory
không gian làm việc). Tôi thực sự muốn tìm cách tăng tốc độ chuyển đổi sang từ điển hoặc hiểu rõ hơn về một chiến lược tốt hơn để thao túng một lượng lớn dữ liệu thuộc tính bằng Python.
UpdateCursors sẽ không hoạt động tốt đối với tôi, bởi vì khi một hàng thay đổi, nó có khả năng kích hoạt các thay đổi ở một số người khác. Xoay vòng và xử lý chúng cùng một lúc là quá cồng kềnh cho những gì tôi cần.
subdict = {}
thông qua del subdict
mang lại thời gian xử lý khoảng 10 giây.
subdict[field] = row[cursor_fields.index(field)]
có nhanh hơn gọi điện hay không subdict[field] = row.getValue(field)
. Trong kịch bản sau, bạn sẽ thực hiện một bước ... mặc dù sự khác biệt về hiệu suất giữa lập chỉ mục hai danh sách ( cursor_fields
và row
) và sử dụng một quy trình ESRI duy nhất có thể không tốt hơn nhiều và thậm chí còn tồi tệ hơn!