열 8 개와 ~ 1670 만 개의 레코드가있는 테이블이 있습니다. 열에 if-else 방정식 세트를 실행해야합니다. UpdateCursor 모듈을 사용하여 스크립트를 작성했지만 몇 백만 레코드 후에 메모리가 부족합니다. 이 1670 만 개의 레코드를 처리하는 더 좋은 방법이 있는지 궁금합니다.
import arcpy
arcpy.TableToTable_conversion("combine_2013", "D:/mosaic.gdb", "combo_table")
c_table = "D:/mosaic.gdb/combo_table"
fields = ['dev_agg', 'herb_agg','forest_agg','wat_agg', 'cate_2']
start_time = time.time()
print "Script Started"
with arcpy.da.UpdateCursor(c_table, fields) as cursor:
for row in cursor:
# row's 0,1,2,3,4 = dev, herb, forest, water, category
#classficiation water = 1; herb = 2; dev = 3; forest = 4
if (row[3] >= 0 and row[3] > row[2]):
row[4] = 1
elif (row[2] >= 0 and row[2] > row[3]):
row[4] = 4
elif (row[1] > 180):
row[4] = 2
elif (row[0] > 1):
row[4] = 3
cursor.updateRow(row)
end_time = time.time() - start_time
print "Script Complete - " + str(end_time) + " seconds"
업데이트 # 1
40GB RAM이있는 컴퓨터에서 동일한 스크립트를 실행했습니다 (원래 컴퓨터에는 12GB RAM 만 있음). ~ 16 시간 후에 성공적으로 완료되었습니다. 나는 16 시간이 너무 길다고 생각하지만 그렇게 큰 데이터 세트를 사용한 적이 없으므로 기대할 바가 없습니다. 이 스크립트에 새로 추가 된 것은 arcpy.env.parallelProcessingFactor = "100%"
입니다. 나는 두 가지 제안 된 방법을 시도하고 있습니다. (1) 백만 개의 레코드를 일괄 처리하고 (2) SearchCursor를 사용하고 csv에 출력을 작성합니다. 진행 상황을 곧보고하겠습니다.
업데이트 # 2
SearchCursor 및 CSV 업데이트가 훌륭하게 작동했습니다! 나는 정확한 실행 시간이 없지만 내일 사무실에있을 때 게시물을 업데이트하지만 대략적인 실행 시간은 ~ 5-6 분이라고 말하면 꽤 인상적입니다. 나는 그것을 기대하지 않았다. 닦지 않은 코드를 공유하고 있으며 의견과 개선 사항이 있으면 언제든지 환영합니다.
import arcpy, csv, time
from arcpy import env
arcpy.env.parallelProcessingFactor = "100%"
arcpy.TableToTable_conversion("D:/mosaic.gdb/combine_2013", "D:/mosaic.gdb", "combo_table")
arcpy.AddField_management("D:/mosaic.gdb/combo_table","category","SHORT")
# Table
c_table = "D:/mosaic.gdb/combo_table"
fields = ['wat_agg', 'dev_agg', 'herb_agg','forest_agg','category', 'OBJECTID']
# CSV
c_csv = open("D:/combine.csv", "w")
c_writer = csv.writer(c_csv, delimiter= ';',lineterminator='\n')
c_writer.writerow (['OID', 'CATEGORY'])
c_reader = csv.reader(c_csv)
start_time = time.time()
with arcpy.da.SearchCursor(c_table, fields) as cursor:
for row in cursor:
#skip file headers
if c_reader.line_num == 1:
continue
# row's 0,1,2,3,4,5 = water, dev, herb, forest, category, oid
#classficiation water = 1; dev = 2; herb = 3; ; forest = 4
if (row[0] >= 0 and row[0] > row[3]):
c_writer.writerow([row[5], 1])
elif (row[1] > 1):
c_writer.writerow([row[5], 2])
elif (row[2] > 180):
c_writer.writerow([row[5], 3])
elif (row[3] >= 0 and row[3] > row[0]):
c_writer.writerow([row[5], 4])
c_csv.close()
end_time = time.time() - start_time
print str(end_time) + " - Seconds"
업데이트 # 3 최종 업데이트. 스크립트의 총 실행 시간은 ~ 199.6 초 /3.2 분입니다.