Tôi có một bảng có 8 cột và ~ 16,7 triệu bản ghi. Tôi cần chạy một bộ phương trình if-other trên các cột. Tôi đã viết một tập lệnh bằng mô-đun UpdateCthon, nhưng sau vài triệu bản ghi, nó hết bộ nhớ. Tôi đã tự hỏi nếu có một cách tốt hơn để xử lý 16,7 triệu hồ sơ này.
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"
CẬP NHẬT # 1
Tôi đã chạy cùng một kịch bản trên một máy tính có RAM 40 gb (máy tính ban đầu chỉ có 12 gb RAM). Nó hoàn thành thành công sau ~ 16 giờ. Tôi cảm thấy 16 giờ là quá dài, nhưng tôi chưa bao giờ làm việc với bộ dữ liệu lớn như vậy nên tôi không biết phải mong đợi điều gì. Sự bổ sung mới duy nhất cho kịch bản này là arcpy.env.parallelProcessingFactor = "100%"
. Tôi đang thử hai phương pháp được đề xuất (1) thực hiện 1 triệu bản ghi theo đợt và (2) sử dụng SearchCoder và viết kết quả đầu ra cho csv. Tôi sẽ báo cáo về tiến độ trong thời gian ngắn.
CẬP NHẬT # 2
Bản cập nhật SearchCthon và CSV đã hoạt động rất tốt! Tôi không có thời gian chạy chính xác, tôi sẽ cập nhật bài đăng khi tôi ở văn phòng vào ngày mai nhưng tôi sẽ nói thời gian chạy gần đúng là ~ 5-6 phút, khá ấn tượng. Tôi đã không mong đợi nó. Tôi đang chia sẻ mã chưa được đánh bóng của mình, mọi bình luận và cải tiến đều được hoan nghênh:
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"
CẬP NHẬT # 3 Cập nhật cuối cùng. Tổng thời gian chạy cho tập lệnh là ~ 199,6 giây / 3,2 phút.