मेरे पास 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
मैंने 40 जीबी रैम वाले कंप्यूटर पर एक ही स्क्रिप्ट चलाई (मूल कंप्यूटर में केवल 12 जीबी रैम थी)। यह ~ 16 घंटे के बाद सफलतापूर्वक पूरा हुआ। मुझे लगता है कि 16 घंटे बहुत लंबा है, लेकिन मैंने इतने बड़े डेटासेट के साथ कभी काम नहीं किया है, इसलिए मुझे नहीं पता कि क्या करना है। इस स्क्रिप्ट का एकमात्र नया जोड़ है arcpy.env.parallelProcessingFactor = "100%"
। मैं दो सुझाए गए तरीकों की कोशिश कर रहा हूं (1) बैचों में 1 मिलियन रिकॉर्ड कर रहा हूं और (2) सीएससी के लिए खोजकर्ता और लेखन सामग्री का उपयोग कर रहा हूं। जल्द ही प्रगति पर रिपोर्ट दूंगा।
अद्यतन # 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 मिनट है।