8 sütun ve ~ 16,7 milyon kayıt içeren bir tablo var. Ben sütunlarda if-else denklemleri bir dizi çalıştırmak gerekir. UpdateCursor modülünü kullanarak bir senaryo yazdım, ancak birkaç milyon kayıttan sonra bellek bitiyor. Bu 16,7 milyon kaydı işlemek için daha iyi bir yol olup olmadığını merak ediyordum.
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"
GÜNCELLEME # 1
Aynı komut dosyasını 40 gb RAM ile bir bilgisayarda çalıştırdım (orijinal bilgisayarda sadece 12 gb RAM vardı). ~ 16 saat sonra başarıyla tamamlandı. 16 saatin çok uzun olduğunu hissediyorum, ancak hiç bu kadar büyük veri kümesiyle çalışmadım, bu yüzden ne bekleyeceğimi bilmiyorum. Bu senaryoya tek yeni ekleme arcpy.env.parallelProcessingFactor = "100%"
. Ben iki önerilen yöntemleri (1) toplu işlerde 1 milyon kayıt yapmak ve (2) SearchCursor kullanarak ve csv çıktıları yazma deniyorum. Kısa süre içinde ilerlemeyi rapor edeceğim.
GÜNCELLEME # 2
SearchCursor ve CSV güncellemesi harika çalıştı! Kesin çalışma süreleri yok, yarın ofiste olduğumda yazıyı güncelleyeceğim, ancak yaklaşık çalışma süresinin ~ 5-6 dakika olduğunu söyleyebilirim ki bu oldukça etkileyici. Beklemiyordum. Herhangi bir yorum ve iyileştirme bekliyoruz cilasız kod paylaşıyorum:
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"
GÜNCELLEME # 3 Son güncelleme. Komut dosyasının toplam çalışma süresi ~ 199.6 saniye / 3.2 dakikadır.