पिछले संस्करणों की तुलना में डेटा एक्सेस कर्सर का प्रदर्शन कितना बढ़ा है?


18

डेटा एक्सेस मॉड्यूल को आर्कजीआईएस संस्करण 10.1 के साथ पेश किया गया था। ESRI डेटा एक्सेस मॉड्यूल का वर्णन इस प्रकार है ( स्रोत ):

डेटा एक्सेस मॉड्यूल, arcpy.da, डेटा के साथ काम करने के लिए पायथन मॉड्यूल है। यह एडिट सेशन, एडिट ऑपरेशन, बेहतर कर्सर सपोर्ट (तेज प्रदर्शन सहित) को नियंत्रित करने, टेबल और फीचर क्लासेस को न्यूमपी एरेज़ से, और वर्जनिंग, रेप्लिका, डोमेन के लिए सपोर्ट, और वर्कफ़्लोज़ को सब-सपोर्ट देता है।

हालाँकि, कर्सर के प्रदर्शन में पिछली पीढ़ी के कर्सरों के स्तर में इतना सुधार क्यों है, इस बारे में बहुत कम जानकारी है।

संलग्न आंकड़ा नई daपद्धति UpdateCursor बनाम पुरानी UpdateCursor विधि पर एक बेंचमार्क परीक्षण के परिणाम दिखाता है । अनिवार्य रूप से, स्क्रिप्ट निम्नलिखित वर्कफ़्लो करती है:

  1. यादृच्छिक अंक बनाएं (10, 100, 1000, 10000, 100000)
  2. एक सामान्य वितरण से बेतरतीब ढंग से नमूना और एक कर्सर के साथ यादृच्छिक अंक विशेषता तालिका में एक नए स्तंभ के लिए मूल्य जोड़ें
  3. नए और पुराने दोनों UpdateCursor तरीकों के लिए प्रत्येक यादृच्छिक बिंदु परिदृश्य के 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 के बाद से आर्कजीआईएस में उपलब्ध समान अंतर्निहित आर्कोबजेक्ट्स का उपयोग करता है (उदाहरण के लिए सीपीसीयन खोज कर्सर का कार्यान्वयन , इसके कार्यान्वयन में कोड नमूनों की तरह बहुत कुछ दिखता है , सिवाय इसके कि आप C ++ के बजाय C ++ में जानते हैं)।

स्पीडअप पाने के लिए हमने जो दो मुख्य काम किए हैं वे इस प्रकार हैं:

  1. अमूर्तन की परतों को हटा दें: पायथन कर्सर का प्रारंभिक कार्यान्वयन पुराने डिस्पैच / COM आधारित GPDispatch ऑब्जेक्ट पर आधारित था , जो किसी भी भाषा में उसी एपीआई का उपयोग करने में सक्षम था जो COM डिस्पैच ऑब्जेक्ट का उपभोग कर सकता था । इसका मतलब है कि आपके पास एक एपीआई था जो किसी एकल वातावरण के लिए विशेष रूप से अच्छी तरह से अनुकूलित नहीं था, लेकिन इसका मतलब यह भी था कि कॉम ऑब्जेक्ट्स के लिए एब्स्ट्रेक्शन की बहुत सारी परतें थीं , उदाहरण के लिए, रनटाइम पर तरीकों को विज्ञापित करने और हल करने के लिए। यदि आप आरसीजीआईएस 9.3 से पहले याद करते हैं, तो उसी क्लंकी इंटरफ़ेस का उपयोग करके जियोप्रोसेसिंग स्क्रिप्ट लिखना संभव था, यहां तक ​​कि कई भाषाओं, यहां तक ​​कि पर्ल और रूबी भी । अतिरिक्त कागजी कार्रवाई एक वस्तु को संभालने की जरूरत हैIDispatch सामान कॉल करने के लिए बहुत जटिलता और मंदी जोड़ता है।
  2. पाइथोनिक मुहावरों और डेटा संरचनाओं का उपयोग करते हुए, एक कड़ाई से एकीकृत, पायथन विशिष्ट सी ++ लाइब्रेरी बनाएं: एक Rowवस्तु का विचार और वास्तव में अजीब while cursor.Next():नृत्य पाइथन में सादे अक्षम थे। किसी सूची से आइटम प्राप्त करना एक बहुत तेज़ कार्रवाई है, और केवल एक जोड़े को CPython फ़ंक्शन कॉल (मूल रूप से __getitem__कॉल, सूचियों पर भारी अनुकूलित) के लिए सरल बनाता है । row.getValue("column")तुलना करके करना अधिक भारी है: यह __getattr__विधि लाने के लिए करता है (जिस पर इसे एक नई बाध्य विधि ऑब्जेक्ट बनाने की आवश्यकता है), फिर उस विधि को दिए गए तर्कों ( __call__) के साथ कॉल करें । arcpy.daकार्यान्वयन का प्रत्येक भाग CPython API के साथ बहुत बारीकी से एकीकृत है देशी पायथन डेटा संरचनाओं (और बहुत अधिक गति और स्मृति दक्षता के लिए भी) का उपयोग करते हुए, इसे तेज करने के लिए बहुत सारे हाथ से सी ++ के साथ।

आप यह भी देखेंगे कि लगभग किसी भी बेंचमार्क में ( उदाहरण के लिए इन स्लाइड्स देखें ), .Net और C ++ में आर्कोबजेक्ट्स अभी भी arcpy.daअधिकांश कार्यों की तुलना में दोगुने से अधिक हैं। पायथन कोड का उपयोग arcpy.daतेज है, लेकिन अभी भी संकलित, निचले स्तर की भाषा से तेज नहीं है।

टीएल; डीआर : daतेजी से होता daहै क्योंकि सीधे-अप, अनधिकृत आर्कोबिज / सी ++ / सीपीथॉन में लागू किया जाता है, जिसे विशेष रूप से तेज पायथन कोड में परिणाम के लिए डिज़ाइन किया गया था।


4

प्रदर्शन संबंधी

  • डिफ़ॉल्ट रूप से फ़ील्ड की सेट सूची के माध्यम से कर्सर केवल पुनरावृत्त होता है (संपूर्ण डेटाबेस नहीं)

अन्य सीधे प्रदर्शन से संबंधित नहीं हैं, लेकिन अच्छी वृद्धि:

  • सुविधा ज्यामिति तक पहुँचने के लिए टोकन (जैसे SHAPE @ LENGTH, SHAPE @ XY) का उपयोग करने की क्षमता
  • डेटाबेस के माध्यम से चलने की क्षमता ( arcpy.da.Walk विधि का उपयोग करके )
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.