পূর্ববর্তী সংস্করণগুলির তুলনায় ডেটা অ্যাক্সেস কার্সারের কার্যকারিতা কীভাবে এত বাড়ানো হয়েছে?


18

আরকিজিআইএস সংস্করণ 10.1 এর সাথে ডেটা অ্যাক্সেস মডিউলটি চালু করা হয়েছিল। ESRI ডেটা অ্যাক্সেস মডিউলটিকে নিম্নরূপ ( উত্স ) হিসাবে বর্ণনা করেছে :

ডেটা অ্যাক্সেস মডিউল, আরসিপি.ডি, ডেটা নিয়ে কাজ করার জন্য পাইথন মডিউল। এটি সম্পাদনা অধিবেশন, সম্পাদনা অপারেশন, উন্নত কার্সার সমর্থন (দ্রুত পারফরম্যান্স সহ), সারণী এবং বৈশিষ্ট্য শ্রেণিগুলিকে NumPy অ্যারেতে এবং এর থেকে রূপান্তর করার জন্য ফাংশন এবং সংস্করণ, প্রতিরূপ, ডোমেন এবং সাব টাইপ ওয়ার্কফ্লো সমর্থন করে support

যাইহোক, কার্সারের পূর্ববর্তী প্রজন্মের তুলনায় কার্সার কার্যকারিতা কেন এত উন্নত হয়েছে সে সম্পর্কে খুব কম তথ্য আছে।

সংযুক্ত চিত্রটি daপুরাতন আপডেটডাক্সার পদ্ধতি বনাম নতুন পদ্ধতি আপডেটকর্সারে একটি মানদণ্ড পরীক্ষার ফলাফল দেখায় । মূলত, স্ক্রিপ্টটি নিম্নলিখিত কর্মপ্রবাহটি সম্পাদন করে:

  1. এলোমেলো পয়েন্ট তৈরি করুন (10, 100, 1000, 10000, 100000)
  2. এলোমেলোভাবে একটি সাধারণ বিতরণ থেকে নমুনা এবং একটি কার্সর সহ এলোমেলো পয়েন্টস অ্যাট্রিবিউট টেবিলের একটি নতুন কলামে মান যুক্ত করুন
  3. নতুন এবং পুরানো উভয় আপডেট কার্সার পদ্ধতির জন্য প্রতিটি র্যান্ডম পয়েন্ট দৃশ্যের 5 টি পুনরাবৃত্তি চালান এবং তালিকায় গড় মান লিখুন
  4. ফলাফল প্লট করুন

daচিত্রের দেখানো ডিগ্রিতে কার্সর সম্পাদনাকে উন্নত করতে আপডেট কার্সর সহ পর্দার আড়ালে কী চলছে ?


এখানে চিত্র বর্ণনা লিখুন


import arcpy, os, numpy, time
arcpy.env.overwriteOutput = True

outws = r'C:\temp'
fc = os.path.join(outws, 'randomPoints.shp')

iterations = [10, 100, 1000, 10000, 100000]
old = []
new = []

meanOld = []
meanNew = []

for x in iterations:
    arcpy.CreateRandomPoints_management(outws, 'randomPoints', '', '', x)
    arcpy.AddField_management(fc, 'randFloat', 'FLOAT')

    for y in range(5):

        # Old method ArcGIS 10.0 and earlier
        start = time.clock()

        rows = arcpy.UpdateCursor(fc)

        for row in rows:
            # generate random float from normal distribution
            s = float(numpy.random.normal(100, 10, 1))
            row.randFloat = s
            rows.updateRow(row)

        del row, rows

        end = time.clock()
        total = end - start
        old.append(total)

        del start, end, total

        # New method 10.1 and later
        start = time.clock()

        with arcpy.da.UpdateCursor(fc, ['randFloat']) as cursor:
            for row in cursor:
                # generate random float from normal distribution
                s = float(numpy.random.normal(100, 10, 1))
                row[0] = s
                cursor.updateRow(row)

        end = time.clock()
        total = end - start
        new.append(total)
        del start, end, total
    meanOld.append(round(numpy.mean(old),4))
    meanNew.append(round(numpy.mean(new),4))

#######################
# plot the results

import matplotlib.pyplot as plt
plt.plot(iterations, meanNew, label = 'New (da)')
plt.plot(iterations, meanOld, label = 'Old')
plt.title('arcpy.da.UpdateCursor -vs- arcpy.UpdateCursor')
plt.xlabel('Random Points')
plt.ylabel('Time (minutes)')
plt.legend(loc = 2)
plt.show()

উত্তর:


25

arcpy.daএখানকার অন্যতম বিকাশকারী । আমরা পারফরম্যান্সটি পেয়েছি কারণ এটি ছিল কারণ পারফরম্যান্স আমাদের প্রাথমিক উদ্বেগ ছিল : পুরানো কার্সারগুলির সাথে প্রধান গ্রিপটি ছিল যে তারা ধীরে ধীরে ছিল, তাদের কোনও নির্দিষ্ট কার্যকারিতার অভাব ছিল না। কোডটি 8.x থেকে আর্কজিআইএস-এ পাওয়া একই অন্তর্নিহিত আরকোবজেক্টগুলি ব্যবহার করে (উদাহরণস্বরূপ, অনুসন্ধান কার্সারের সিপিথন বাস্তবায়ন, উদাহরণস্বরূপ, এর বাস্তবায়নে এর মতো কোড স্যাম্পেলের মতো অনেক বেশি দেখাচ্ছে , আপনি জানেন যে সি # এর পরিবর্তে সি ++ এ)।

স্পিডআপটি পেতে আমরা মূল দুটি জিনিস হ'ল:

  1. বিমূর্তনের স্তরগুলি নির্মূল করুন: পাইথন কার্সারের প্রাথমিক প্রয়োগটি পুরানো ডিসপ্যাচ / সিওএম ভিত্তিক জিপিডিস্পাচ অবজেক্টের উপর ভিত্তি করে তৈরি হয়েছিল , যা কোনও ভাষাতে সিওএম ডিসপ্যাচ অবজেক্টগুলিকে গ্রাস করতে পারে এমন একই API ব্যবহার করতে সক্ষম করেছিল । এর অর্থ হ'ল আপনার এমন একটি এপিআই ছিল যা কোনও একক পরিবেশের জন্য বিশেষভাবে অনুকূল ছিল না, তবে এটির অর্থও ছিল যে রান-টাইমে বিজ্ঞাপন এবং পদ্ধতিগুলি সমাধান করার জন্য COM অবজেক্টগুলির জন্য প্রচুর বিমূর্ততার স্তর রয়েছে। আপনি যদি আর্কজিআইএস 9.3 এর আগে মনে রাখেন, একই ক্লানকি ইন্টারফেসটি অনেকগুলি ভাষা এমনকি পার্ল এবং রুবি ব্যবহার করে জিওপ্রসেসিং স্ক্রিপ্টগুলি লেখা সম্ভব ছিল । কোনও বিষয়টিকে পরিচালনা করার জন্য কোনও অতিরিক্ত কাগজপত্রের প্রয়োজনIDispatch স্টাফ কলগুলি ফাংশনগুলিতে প্রচুর জটিলতা এবং মন্থরতা যুক্ত করে।
  2. পাইথোনিক আইডিয়াম এবং ডেটা স্ট্রাকচার ব্যবহার করে একটি দৃly়ভাবে সংহত, পাইথন নির্দিষ্ট সি ++ গ্রন্থাগার তৈরি করুন: কোনও Rowবস্তুর ধারণা এবং সত্যই অদ্ভুত while cursor.Next():নৃত্যটি পাইথনের ক্ষেত্রে কেবল অদক্ষ ছিল। তালিকা থেকে কোনও আইটেম আনা একটি খুব দ্রুত অপারেশন, এবং কেবলমাত্র সিপিথন ফাংশন কলগুলির কয়েকটি (মূলত একটি __getitem__কল, তালিকাগুলিতে ভারী অনুকূলিতকরণ) এ সহজ হয়। এরকম row.getValue("column")তুলনা করে আরও হেভিওয়েট: এটি একটি করে __getattr__পদ্ধতি (এটি একটি নতুন আবদ্ধ পদ্ধতি অবজেক্ট তৈরি করার প্রয়োজন হয় যা দিকে) আনা, তারপর দেওয়া আর্গুমেন্ট সহ যে পদ্ধতি কল ( __call__)। arcpy.daবাস্তবায়নের প্রতিটি অংশ সিপিথন এপিআইয়ের সাথে খুব ঘনিষ্ঠভাবে সংহত হয়েছে দেশীয় পাইথন ডেটা স্ট্রাকচার (এবং আরও স্পীড এবং মেমরির দক্ষতার জন্য অদ্ভুত সংহতকরণ) ব্যবহার করে এটি দ্রুত তৈরি করতে প্রচুর হ্যান্ড-সুরযুক্ত সি ++ সহ with

আপনি আরও লক্ষ্য করবেন যে প্রায় কোনও মানদণ্ডে ( উদাহরণস্বরূপ এই স্লাইডগুলি দেখুন ), নেট এবং সি ++ এর আরকোবজেক্টগুলি এখনও arcpy.daবেশিরভাগ কাজের চেয়ে দ্বিগুণ দ্রুত are পাইথন কোডটি ব্যবহার arcpy.daকরা দ্রুত, তবে এটি সংকলিত, নিম্ন-স্তরের ভাষার চেয়ে দ্রুত নয়।

টিএল; ডিআর : daদ্রুত: কারণ daস্ট্রেট-আপ, অযৌক্তিক আরকোবজেক্টস / সি ++ / সিপিথনে প্রয়োগ করা হয়েছে যা বিশেষত দ্রুত পাইথন কোডের ফলাফলের জন্য ডিজাইন করা হয়েছিল।


4

পারফরম্যান্স সম্পর্কিত

  • ডিফল্টরূপে ক্ষেত্রগুলির সেট তালিকার মাধ্যমে ক্রসার কেবল পুনরাবৃত্তি করে (পুরো ডাটাবেস নয়)

অন্যান্য পারফরম্যান্সের সাথে সরাসরি সম্পর্কিত নয়, তবে দুর্দান্ত বর্ধনসমূহ:

  • বৈশিষ্ট্য জ্যামিতিতে অ্যাক্সেসের জন্য টোকেনগুলি ব্যবহার করার ক্ষমতা (যেমন শেপ @ লেন্থ, শেপ @ এক্সওয়াই)
  • ডাটাবেসগুলির মাধ্যমে হাঁটার ক্ষমতা ( আরকিপি.ডি.ওয়াক পদ্ধতি ব্যবহার করে )
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.