আমার কাছে 8 টি কলাম এবং .7 16.7 মিলিয়ন রেকর্ড সহ একটি টেবিল রয়েছে। কলামগুলিতে আমার-অন্য সমীকরণগুলির একটি সেট চালানো দরকার। আমি আপডেটক্রসার মডিউলটি ব্যবহার করে একটি স্ক্রিপ্ট লিখেছি, কিন্তু কয়েক মিলিয়ন রেকর্ডের পরে এটি মেমরির বাইরে চলে যায়। আমি ভাবছিলাম এই 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) ব্যাচে 10 মিলিয়ন রেকর্ড করা এবং (2) সার্চকার্সার ব্যবহার করে এবং সিএসভিতে আউটপুট লেখার জন্য। আমি শীঘ্রই অগ্রগতি সম্পর্কে রিপোর্ট করব।
আপডেট # 2
সার্চকার্সার এবং সিএসভি আপডেট দুর্দান্তভাবে কাজ করেছে! আমার যথাযথ রান সময় নেই, আমি আগামীকাল অফিসে থাকাকালীন পোস্টটি আপডেট করব তবে আমি বলব আনুমানিক রান সময়টি 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 চূড়ান্ত আপডেট। স্ক্রিপ্টের মোট রান সময় time 199.6 সেকেন্ড / 3.2 মিনিট।