আর্কপাই ব্যবহার করে 16 মিলিয়ন রেকর্ডের মধ্য দিয়ে লুপিং করছেন?


13

আমার কাছে 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 মিনিট।


1
আপনি কি 64 বিট (ব্যাকগ্রাউন্ড বা সার্ভার বা প্রো) ব্যবহার করছেন?
KHibma

উল্লেখ করতে ভুলে গেছি আমি ব্যাকগ্রাউন্ডে 10.4 x64 চালাচ্ছি।
সিটিপিপিথন

ডেভিলস অ্যাডভোকেট - আপনি কি আর্কিপ্যাপ খোলা থাকার দরকার নেই বলে আপনার স্ক্রিপ্টটির দিকে তাকানোর জন্য আপনি অগ্রভাগে বা আইডিএল থেকে চালানোর চেষ্টা করেছেন ?
হর্নবিড্ড

এটি একটি স্বতন্ত্র স্ক্রিপ্ট হিসাবে চালান বা আপনি যদি এসকিউএল জানেন,
শেগফাইল

1
আমি বুঝতে পারি এটি ওপেন সোর্স, তবে এটি অনুমোদনের প্রক্রিয়াটি ~ 1-2 সপ্তাহ সময় নেয় এবং এটি সময় সংবেদনশীল তাই আমি মনে করি না যে এটি এই ক্ষেত্রে সম্ভব হয়।
সিটিপিপিথন

উত্তর:


4

আপনি কোনও সিএসভি ফাইলে অবজেক্টড এবং গণনার ফলাফল (cate_2) লিখতে পারেন। তারপরে ফলাফল সংরক্ষণের জন্য সিএসভিতে আপনার আসল ফাইলে যোগ দিন, একটি ক্ষেত্রকে পপুলেট করুন। এইভাবে আপনি ডিএ কার্সার ব্যবহার করে টেবিলটি আপডেট করছেন না। আপনি একটি অনুসন্ধান কার্সার ব্যবহার করতে পারেন।


আমি এখানে একই বিষয় ভাবছিলাম যেহেতু এখানে আলোচনা আছে এবং তারা আরও বড় ডেটাসেট সম্পর্কে কথা বলছে।
হর্নবিড্ড

ধন্যবাদ, ক্লিওস এটি আশাব্যঞ্জক মনে হচ্ছে। আমি ফেলিক্সআইপির পরামর্শ এবং আকর্ষণীয় আলোচনা সহ এটি চেষ্টা করব যদিও আমাকে কয়েক ডজনবার এটি চালাতে হবে।
সিটিপিপিথন

দুর্দান্তভাবে কাজ করেছেন! আমি সর্বশেষ স্ক্রিপ্ট দিয়ে প্রশ্ন আপডেট করেছি। ধন্যবাদ!
সিটিপিপিথন

2

দুঃখিত, আমি যদি এই পুরাতন থ্রেডটি পুনরুদ্ধার করি। ধারণাটি ছিল কম্বাইন রাস্টার সম্পর্কে যদি-অন্য বিবৃতিগুলি সম্পাদন করা হয় এবং তারপরে একটি নতুন রাস্টার তৈরি করতে লুকআপে নতুন ক্ষেত্রটি ব্যবহার করা হয়। আমি টেবিল হিসাবে ডেটা রফতানি করে সমস্যাটিকে জটিল করেছিলাম এবং অকেজো ওয়ার্কফ্লো প্রবর্তন করেছি যা @ অ্যালেক্স তেরেশেনকভ দ্বারা সম্বোধন করা হয়েছিল। স্পষ্টত উপলব্ধি করার পরে, আমি ডেটাটি 17 টি ক্যোয়ারিতে (প্রতিটি 1 মিলিয়ন) ব্যাচ করেছিলাম যেমন এটি @ ফেলিক্সআইপি দ্বারা প্রস্তাবিত হয়েছিল। এটি প্রতিটি ব্যাচটি শেষ হতে গড়ে ~ 1.5 মিনিট সময় নেয় এবং মোট রান সময়টি ছিল 23.3 মিনিট। এই পদ্ধতিতে যোগদানের প্রয়োজনীয়তা দূর করে এবং আমি মনে করি যে এই পদ্ধতিটি সর্বোত্তমভাবে কার্য সম্পাদন করে। ভবিষ্যতের রেফারেন্সের জন্য এখানে একটি সংশোধিত স্ক্রিপ্ট রয়েছে:

import arcpy, time
from arcpy import env

def cursor():
    combine = "D:/mosaic.gdb/combine_2013"
    #arcpy.AddField_management(combine,"cat_1","SHORT")
    fields = ['wat_agg', 'dev_agg', 'herb_agg','forest_agg', 'cat_1']
    batch = ['"OBJECTID" >= 1 AND "OBJECTID" <= 1000000', '"OBJECTID" >= 1000001 AND "OBJECTID" <= 2000000', '"OBJECTID" >= 2000001 AND "OBJECTID" <= 3000000', '"OBJECTID" >= 3000001 AND "OBJECTID" <= 4000000', '"OBJECTID" >= 4000001 AND "OBJECTID" <= 5000000', '"OBJECTID" >= 5000001 AND "OBJECTID" <= 6000000', '"OBJECTID" >= 6000001 AND "OBJECTID" <= 7000000', '"OBJECTID" >= 7000001 AND "OBJECTID" <= 8000000', '"OBJECTID" >= 8000001 AND "OBJECTID" <= 9000000', '"OBJECTID" >= 9000001 AND "OBJECTID" <= 10000000', '"OBJECTID" >= 10000001 AND "OBJECTID" <= 11000000', '"OBJECTID" >= 11000001 AND "OBJECTID" <= 12000000', '"OBJECTID" >= 12000001 AND "OBJECTID" <= 13000000', '"OBJECTID" >= 13000001 AND "OBJECTID" <= 14000000', '"OBJECTID" >= 14000001 AND "OBJECTID" <= 15000000', '"OBJECTID" >= 15000001 AND "OBJECTID" <= 16000000', '"OBJECTID" >= 16000001 AND "OBJECTID" <= 16757856']
    for i in batch:
        start_time = time.time()
        with arcpy.da.UpdateCursor(combine, fields, i) as cursor:
            for row in cursor:
            # row's 0,1,2,3,4,5 = water, dev, herb, forest, category
            #classficiation water = 1; dev = 2; herb = 3; ; forest = 4
                if (row[0] >= 0 and row[0] >= row[3]):
                    row[4] = 1
                elif (row[1] > 1):
                    row[4] = 2
                elif (row[2] > 180):
                    row[4] = 3
                elif (row[3] >= 0 and row[3] > row[0]):
                    row[4] = 4
                cursor.updateRow(row)
        end_time =  time.time() - start_time
        print str(end_time) + " - Seconds"

cursor()

সুতরাং, আমি এটি সঠিকভাবে বুঝতে পারছি তা নিশ্চিত করার জন্য। আপনার মূল পোস্টে আপনি বলেছিলেন যে আপনি যখন 40 গিগাবাইট র‌্যাম নিয়ে কোনও কম্পিউটারে এটি চালিয়েছেন তখন মোট ~ 16 ঘন্টা লেগেছিল। তবে এখন আপনি এটি 17 টি ব্যাচে বিভক্ত করেছেন এবং এটিতে মোট 23 মিনিট সময় লেগেছে। এটা কি ঠিক?

সঠিক। প্রথম রানটি 40 গিগাবাইট র‌্যাম সহ 16 ঘন্টা সময় নিয়েছিল এবং দ্বিতীয় রানটি Lookupনতুন সংজ্ঞায়িত বিভাগগুলির সাথে রেস্টারটি সম্পাদন করতে এবং রফতানি করতে ~ 23 মিনিট + আরও 15 মিনিট সময় নিয়েছিল ।
সিটিপিপিথন

arcpy.env.parallelProcessingFactor = "100%"আপনার লিপির কোনও প্রভাব নেই এমন একটি নোট । আমি সেখানে কোনও সরঞ্জাম দেখতে পাই না that
KHibma

আপনি ঠিক বলেছেন। আমি কোডটি সম্পাদনা করব।
সিটিপিপিথন

1

আপনি ক্যালকুলেটফিল্ড_ম্যানেজমেন্ট ব্যবহার করে পরিবর্তনের চেষ্টা করতে পারেন । এটি কার্সার ব্যবহারের মাধ্যমে লুপিং এড়াতে পারে এবং বিভাগের মানটির জন্য আপনার বিকল্পগুলির চেহারা দেখে আপনি এটি চারটি উপ-প্রক্রিয়া ক্রমবর্ধমান হিসাবে সেট আপ করতে পারেন। প্রতিটি উপপ্রসেস শেষ হওয়ার সাথে সাথে এর স্মৃতিটি পরবর্তী একটি শুরু করার আগে প্রকাশ করা হয়। আপনি প্রতিটি উপ-প্রসেস তৈরি করে একটি ছোট (মিলিসেকেন্ড) হিট করেন।

অথবা, আপনি যদি আপনার বর্তমান পদ্ধতির রাখতে চান তবে এমন একটি উপ-প্রসেস রয়েছে যা একবারে এক্স-সারি নেয়। এটি চালানোর জন্য একটি প্রধান প্রক্রিয়া করুন এবং আগের মতো, প্রতিবার আপনার স্মৃতি শেষ হওয়ার পরে আপনি এটিকে ছড়িয়ে দিতে থাকবেন। এইভাবে এটি করার বোনাস (বিশেষত একা একা অজগর প্রক্রিয়াটির মাধ্যমে) আপনি জিআইএল-এর আশেপাশে পাইথনের মাল্টথ্রেডিংয়ে সাব-প্রোসেসেসগুলি বর্ধন হিসাবে আপনার সমস্ত কোরকে আরও ব্যবহার করতে পারেন। আরকিপি এবং এমন একটি পদ্ধতির সাহায্যে আমি অতীতে বিপুল ডেটা মন্থনে ব্যবহার করেছি। স্পষ্টতই আপনার খণ্ডগুলি ডেটা নীচে রাখুন অন্যথায় আপনি মেমরির দ্রুত চলে যাবেন!


আমার অভিজ্ঞতার সাথে, আরকিপি.ডি.অপডেটস কার্সার ব্যবহার করা আরকিপি-ক্যালকুলেটফিল্ড_ম্যানেজমেন্টের চেয়ে অনেক দ্রুত। আমি একটি স্ক্রিপ্ট লিখেছিলাম যা 55.000.000 বিল্ডিং বৈশিষ্ট্যগুলিতে চলে, এটি ক্যালকুলেটফিল্ড সরঞ্জামের সাথে প্রায় 5 গুণ কম ধীর ছিল।
অফারমান

পয়েন্টটি হ'ল চারটি উপ-প্রক্রিয়া সেট আপ করা এবং মেমরিটিকে ভাসিয়ে দেওয়া কারণ এটিই এখানে আসল চিম্টি পয়েন্ট। আমি দ্বিতীয় অনুচ্ছেদে রূপরেখা হিসাবে আপনি সারি দ্বারা সাবপ্রসেসগুলি বিভক্ত করতে পারেন, তবে এটি একটি সিলেক্টের চেয়ে সামান্য বেশি ব্যবস্থাপনা লাগে।
ম্যাপ্পাগনোসিস

1

ডেটা ম্যানিপুলেশন যুক্তিটি কোনও আপডেটের এসকিউএল স্টেটমেন্ট হিসাবে CASE এক্সপ্রেশন ব্যবহার করে লেখা যেতে পারে, যা আপনি GDAL / OGR ব্যবহার করে এক্সিকিউট করতে পারেন, যেমন OSGeo4W এর মাধ্যমে gdal-filegdbইনস্টল করা।

এখানে কার্যপ্রবাহটি রয়েছে যা এর osgeo.ogrপরিবর্তে ব্যবহার করে arcpy:

import time
from osgeo import ogr

ds = ogr.Open('D:/mosaic.gdb', 1)
if ds is None:
    raise ValueError("You don't have a 'FileGDB' driver, or the dataset doesn't exist")
sql = '''\
UPDATE combo_table SET cate_2 = CASE
    WHEN wat_agg >= 0 AND wat_agg > forest_agg THEN 1
    WHEN dev_agg > 1 THEN 2
    WHEN herb_agg > 180 THEN 3
    WHEN forest_agg >= 0 AND forest_agg > wat_agg THEN 4
    END
'''
start_time = time.time()
ds.ExecuteSQL(sql, dialect='sqlite')
ds = None  # save, close
end_time =  time.time() - start_time
print("that took %.1f seconds" % end_time)

মাত্র 1 মিলিয়ন রেকর্ড সহ একই ধরণের টেবিলে, এই ক্যোয়ারিতে 18 মিনিট সময় লেগেছে। সুতরাং 16 মিলিয়ন রেকর্ড প্রক্রিয়া করতে এখনও 4 থেকে 5 ঘন্টা সময় লাগতে পারে।


দুর্ভাগ্যক্রমে স্ক্রিপ্টটি ব্যবহার করে রচিত বৃহত্তর স্ক্রিপ্টের একটি অংশ arcpyতবে আমি উত্তরটির প্রশংসা করি। আমি আস্তে আস্তে জিডিএল আরও ব্যবহার করার চেষ্টা করছি।
সিটিপিপিথন

1

আপনার প্রশ্নের # 2 বিভাগে কোডটির আপডেটের সাহায্যে আপনি কীভাবে .csvআপনার ফাইল জিওডাটাবেজে মূল টেবিলটিতে ফাইলে যোগদান করছেন তা দেখায় না । আপনি বলছেন যে আপনার স্ক্রিপ্টটি চালাতে ~ 5 মিনিট লেগেছে। আপনি যদি .csvকোনও যোগদান না করেই কেবল ফাইলটি রফতানি করে থাকেন তবে এই বিষয়টি মোটামুটি মনে হচ্ছে । আপনি যখন .csvফাইলটি আরকজিআইএস-এ ফিরিয়ে আনার চেষ্টা করবেন , আপনি কার্য সম্পাদন সংক্রান্ত সমস্যাগুলিকে আঘাত করবেন।

1) আপনি .csvজিওডাটাবেস টেবিল থেকে সরাসরি যোগদান করতে পারবেন না , কারণ .csvফাইলটির একটি ওআইডি নেই (অনন্য মানের সাথে গণনা করা একটি ক্ষেত্র থাকা আপনাকে সাহায্য করবে না কারণ এখনও আপনার .csvফাইলকে জিওডাটাবেস টেবিলে রূপান্তর করতে হবে)। সুতরাং, Table To Tableজিপি সরঞ্জামের জন্য কয়েক মিনিট (আপনি in_memoryসেখানে একটি টেম্প টেবিল তৈরি করতে ওয়ার্কস্পেস ব্যবহার করতে পারেন , কিছুটা দ্রুত হবে)।

২) আপনি .csvজিওডাটাবেস টেবিলটিতে লোড করার পরে , আপনি যে ক্ষেত্রটি objectidজোড় করবেন সে ক্ষেত্রে আপনি একটি সূচক তৈরি করতে চান (আপনার ক্ষেত্রে, .csvফাইলটি থেকে উত্স ভু । এটি 16 মিলিয়ন এমএল সারি টেবিলের জন্য কয়েক মিনিট সময় নিতে পারে।

3) তারপর আপনি হয় ব্যবহার করতে হবে Add Joinবা Join Fieldজিপি সরঞ্জাম। আপনার বড় টেবিলগুলিতে কেউই ভাল পারফর্ম করবে না।

4) এরপরে, Calculate Fieldনতুন যোগদানের ক্ষেত্রগুলি গণনা করার জন্য আপনাকে জিপি সরঞ্জামটি করতে হবে। অনেক মিনিট এখানে যায়; আরও বেশি, ক্ষেত্রগুলি যে গণনাগুলিতে অংশ নেওয়া ক্ষেত্রগুলি একটি যুক্ত টেবিল থেকে আসে সে ক্ষেত্রে ক্ষেত্রের গণনা আরও বেশি সময় নেয়।

এক কথায়, আপনি উল্লেখ 5 মিনিটের কাছাকাছি কিছুই পাবেন না। আপনি যদি এটি এক ঘন্টা তৈরি করেন তবে আমি মুগ্ধ হব।

আরকজিআইএস-এর মধ্যে বড় ডেটাসেট প্রসেসিংয়ের বিষয়টি এড়াতে, আমি আপনাকে অর্গিজিসের বাইরে আপনার ডেটা একটি pandasডেটা ফ্রেমে নিয়ে যাওয়ার পরামর্শ দিচ্ছি এবং সেখানে আপনার সমস্ত গণনা করার চেষ্টা করব। আপনার কাজ শেষ হয়ে গেলে, কেবলমাত্র ফ্রেম সারিগুলিকে নতুন জিওডাটাবেস টেবিলের সাথে আবার লিখুন da.InsertCursor(বা আপনি আপনার বিদ্যমান টেবিলটি কেটে ফেলতে পারেন এবং আপনার সারিগুলি উত্সটিতে লিখতে পারেন)।

আমি বেঞ্চমার্কে এটি লিখেছি এমন সম্পূর্ণ কোডটি নীচে:

import time
from functools import wraps
import arcpy
import pandas as pd

def report_time(func):
    '''Decorator reporting the execution time'''
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(func.__name__, round(end-start,3))
        return result
    return wrapper

#----------------------------------------------------------------------
@report_time
def make_df(in_table,limit):
    columns = [f.name for f in arcpy.ListFields(in_table) if f.name != 'OBJECTID']
    cur = arcpy.da.SearchCursor(in_table,columns,'OBJECTID < {}'.format(limit))
    rows = (row for row in cur)
    df = pd.DataFrame(rows,columns=columns)
    return df

#----------------------------------------------------------------------
@report_time
def calculate_field(df):
    df.ix[(df['DataField2'] % 2 == 0), 'Category'] = 'two'
    df.ix[(df['DataField2'] % 4 == 0), 'Category'] = 'four'
    df.ix[(df['DataField2'] % 5 == 0), 'Category'] = 'five'
    df.ix[(df['DataField2'] % 10 == 0), 'Category'] = 'ten'
    df['Category'].fillna('other', inplace=True)
    return df

#----------------------------------------------------------------------
@report_time
def save_gdb_table(df,out_table):
    rows_to_write = [tuple(r[1:]) for r in df.itertuples()]
    with arcpy.da.InsertCursor(out_table,df.columns) as ins_cur:
        for row in rows_to_write:
            ins_cur.insertRow(row)

#run for tables of various sizes
for limit in [100000,500000,1000000,5000000,15000000]:
    print '{:,}'.format(limit).center(50,'-')

    in_table = r'C:\ArcGIS\scratch.gdb\BigTraffic'
    out_table = r'C:\ArcGIS\scratch.gdb\BigTrafficUpdated'
    if arcpy.Exists(out_table):
        arcpy.TruncateTable_management(out_table)

    df = make_df(in_table,limit=limit)
    df = calculate_field(df)
    save_gdb_table(df, out_table)
    print

নীচে ডিবাগ আইও থেকে আউটপুট দেওয়া হয়েছে (রিপোর্ট করা নম্বরটি ব্যবহৃত টেবিলের সারিগুলির সংখ্যা ব্যবহৃত হয়) পৃথক ফাংশনগুলির জন্য এক্সিকিউশন সময় সম্পর্কিত তথ্য সহ:

---------------------100,000----------------------
('make_df', 1.141)
('calculate_field', 0.042)
('save_gdb_table', 1.788)

---------------------500,000----------------------
('make_df', 4.733)
('calculate_field', 0.197)
('save_gdb_table', 8.84)

--------------------1,000,000---------------------
('make_df', 9.315)
('calculate_field', 0.392)
('save_gdb_table', 17.605)

--------------------5,000,000---------------------
('make_df', 45.371)
('calculate_field', 1.903)
('save_gdb_table', 90.797)

--------------------15,000,000--------------------
('make_df', 136.935)
('calculate_field', 5.551)
('save_gdb_table', 275.176)

এর সাথে একটি সারি সন্নিবেশ করতে একটি da.InsertCursorধ্রুবক সময় লাগে, এটি, যদি 1 সারি সন্নিবেশ করতে হয় তবে ধরুন, 0.1 সেকেন্ড, 100 সারি সন্নিবেশ করতে 10 সেকেন্ড সময় লাগবে। দুঃখের বিষয়, মোট কার্যকরকরণের 95% + সময় জিওডাটাবেসস টেবিলটি পড়তে এবং তারপরে জিওডাটাবেজে সারিগুলি সন্নিবেশ করাতে ব্যয় হয়।

জেনারেটর pandasথেকে ডেটা ফ্রেম তৈরি করা এবং da.SearchCursorক্ষেত্র (গুলি) গণনা করার ক্ষেত্রে এটি একই প্রযোজ্য । আপনার উত্স জিওডাটাবেস টেবিলের সারিগুলির সংখ্যা দ্বিগুণ হওয়ার সাথে সাথে উপরের স্ক্রিপ্টটির সম্পাদনের সময়টিও ঘটে। অবশ্যই, কার্যকর করার সময় হিসাবে আপনাকে এখনও 64 বাইট পাইথন ব্যবহার করতে হবে, কিছু বৃহত্তর ডেটা স্ট্রাকচার স্মৃতিতে পরিচালিত হবে।


আসলে, আমি আরেকটি প্রশ্ন জিজ্ঞাসা করতে যাচ্ছিলাম যা আমি যে পদ্ধতিটি ব্যবহার করেছি তার সীমাবদ্ধতা সম্পর্কে কথা বলব, কারণ আপনি যে সমস্যার মুখোমুখি হয়েছি আমি উপরের সমস্যার সমাধান করেছি তাই ধন্যবাদ! আমি যেটি সম্পাদন করতে চাইছি: চারটি রাস্টারকে একত্রিত করুন এবং তারপরে কলামগুলির উপর ভিত্তি করে যদি-অন্য বিবৃতিটি সম্পাদন করুন এবং আউটপুটগুলিকে একটি নতুন কলামে লিখুন এবং শেষ পর্যন্ত নতুন কলামের Lookupমানগুলির উপর ভিত্তি করে রাস্টার তৈরি করতে সঞ্চালন করুন। আমার পদ্ধতিতে অনেকগুলি অপ্রয়োজনীয় পদক্ষেপ এবং অকার্যকর কর্মপ্রবাহ ছিল, আমার মূল প্রশ্নটিতে আমার এটি উল্লেখ করা উচিত ছিল। শিখুন এবং বাচুন. আমি এই স্ক্রিপ্টটি পরে এই সপ্তাহে চেষ্টা করব।
সিটিপিপিথন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.