ฉันมีตารางที่มี 8 คอลัมน์และประมาณ 16.7 ล้านเรคคอร์ด ฉันต้องใช้ชุดสมการ if-else บนคอลัมน์ ฉันเขียนสคริปต์โดยใช้โมดูล UpdateCursor แต่หลังจากบันทึกไปสองสามล้านครั้งมันมีหน่วยความจำไม่เพียงพอ ฉันสงสัยว่าจะมีวิธีที่ดีกว่าในการประมวลผลระเบียน 16.7 ล้านรายการเหล่านี้หรือไม่
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
ฉันรันสคริปต์เดียวกันบนคอมพิวเตอร์ที่มี RAM 40 gb (คอมพิวเตอร์เดิมมี RAM เพียง 12 gb) มันเสร็จสมบูรณ์หลังจาก ~ 16 ชั่วโมง ฉันรู้สึกว่า 16 ชั่วโมงนั้นยาวเกินไป แต่ฉันไม่เคยทำงานกับชุดข้อมูลขนาดใหญ่เช่นนี้ดังนั้นฉันจึงไม่รู้ว่าจะเกิดอะไรขึ้น การเพิ่มสคริปต์ใหม่นี้arcpy.env.parallelProcessingFactor = "100%"
เท่านั้น ฉันพยายามสองวิธีที่แนะนำ (1) ทำ 1 ล้านบันทึกใน batches และ (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 นาที