얼마 전, 속성 테이블을 파이썬 사전으로 변환하는 빠른 파이썬 함수를 작성했습니다.이 키는 사용자 지정 고유 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
이것은 상대적으로 작은 데이터 세트에 효과적이지만 파일 지오 데이터베이스에서 약 100MB의 약 750,000 개의 행과 15 개의 필드를 포함하는 테이블에서 실행했습니다. 이것들에서, 함수는 내가 예상했던 것보다 훨씬 느리게 실행됩니다 : 약 5-6 분 (그리고 이것은 테이블을 in_memory
작업 공간에 복사 한 후입니다 ). 사전으로의 변환 속도를 높이거나 Python을 사용하여 많은 양의 속성 데이터를 조작하기위한 더 나은 전략에 대한 통찰력을 얻고 싶습니다.
한 행이 변경되면 다른 행에서 변경 사항을 트리거 할 가능성이 있기 때문에 UpdateCursors는 나에게 잘 작동하지 않습니다. 한 번에 하나씩 반복하여 처리하는 것은 내가 필요한 것에 너무 성가시다.
subdict = {}
통해 주석 del subdict
처리를하여 약 10 초의 처리 시간 을 산출합니다.
subdict[field] = row[cursor_fields.index(field)]
이 calling 보다 빠른지 여부를 보는 것 subdict[field] = row.getValue(field)
입니다. 후자의 시나리오에서는 두 단계 ( cursor_fields
및 row
)를 인덱싱 하고 단일 ESRI 프로세스를 사용하는 것의 성능 차이 가 훨씬 나아지지 않을 수도 있지만 한 단계 만 수행하는 것입니다 !