Saya punya tabel dengan 8 kolom dan ~ 16,7 juta catatan. Saya perlu menjalankan satu set persamaan if-else pada kolom. Saya telah menulis skrip menggunakan modul UpdateCursor, tetapi setelah beberapa juta catatan kehabisan memori. Saya bertanya-tanya apakah ada cara yang lebih baik untuk memproses 16,7 juta catatan ini.
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"
PEMBARUAN # 1
Saya menjalankan skrip yang sama di komputer dengan 40 gb RAM (komputer asli hanya memiliki 12 gb RAM). Ini berhasil diselesaikan setelah ~ 16 jam. Saya merasa bahwa 16 jam terlalu lama, tetapi saya tidak pernah bekerja dengan set data yang besar sehingga saya tidak tahu apa yang diharapkan. Satu-satunya tambahan baru untuk skrip ini adalah arcpy.env.parallelProcessingFactor = "100%"
. Saya mencoba dua metode yang disarankan (1) melakukan 1 juta catatan dalam batch dan (2) menggunakan SearchCursor dan menulis output ke csv. Saya akan segera melaporkan perkembangannya.
PEMBARUAN # 2
Pembaruan SearchCursor dan CSV bekerja dengan sangat baik! Saya tidak memiliki waktu menjalankan yang tepat, saya akan memperbarui pos ketika saya berada di kantor besok tapi saya akan mengatakan perkiraan waktu berjalan ~ 5-6 menit yang cukup mengesankan. Saya tidak mengharapkannya. Saya membagikan kode saya yang tidak dipoles, semua komentar dan perbaikan disambut:
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"
UPDATE # 3 Pembaruan akhir. Total waktu menjalankan skrip adalah ~ 199,6 detik / 3,2 menit.