আর্কপি স্ক্রিপ্টটি কেন ধীর?


12

বহুভুজ বৈশিষ্ট্যটির মধ্যে থাকা তথ্যের সাথে বিন্দু আকারে ফাইলটিতে একটি ক্ষেত্র আপডেট করার জন্য আমার কাছে একটি সহজ আরকি স্ক্রিপ্ট রয়েছে। আরকিটিতে 100 পয়েন্ট করতে 9 মিনিট সময় লাগে তবে আরক্যাম্যাপে একটি স্থানিক সংযোগ তাত্ক্ষণিক। আমি নিশ্চিত যে এই সমস্যাটি সমাধানের জন্য একটি দ্রুত প্রতিষ্ঠিত উপায় রয়েছে। কেউ আমাকে সঠিক পথ নির্দেশ করতে পারবেন?

import took 0:00:07.085000
extent took 0:00:05.991000
one pt loop took 0:00:03.780000
one pt loop took 0:00:03.850000
one pt loop took 0:00:03.791000


import datetime
t1 = datetime.datetime.now()
import arcpy
t2 = datetime.datetime.now()
print "import took %s" %  ( t2-t1)
#set up environment
arcpy.env.workspace = "data\\"
arcpy.env.overwriteOutput = True

desc = arcpy.Describe("parcels.shp")
ext = desc.Extent
extent = (ext.XMin,ext.XMax,ext.YMin,ext.YMax)
t3 = datetime.datetime.now()
print "extent took %s" %  (t3 -t2)
fc = arcpy.CreateRandomPoints_management("", "malls.shp", "", ext, 100, "", "POINT", "")
arcpy.AddField_management("malls.shp", 'ParcelID', 'LONG')

rows = arcpy.UpdateCursor('malls.shp',"","",'ParcelID')
for row in rows:
    t4 = datetime.datetime.now()
    pt = row.Shape.getPart()
    for polyrow in arcpy.SearchCursor('parcels.shp'):
        t6 = datetime.datetime.now()
        poly = polyrow.getValue('Shape')
        if extent[0]<pt.X<extent[1] and extent[2]<pt.Y<extent[3]:
            if poly.contains(pt):
                print "works"
                row.ParcelID = polyrow.Parcels_ID
                rows.updateRow(row)
                break #we can stop looking for matches since
        t7 = datetime.datetime.now()
        "a full poly loop took %s" % (t7-t6)
    t5 = datetime.datetime.now()
    print "one pt loop took %s" % (t5-t4)


print datetime.datetime.now() -t1

4
আপনি আর্কজিআইএস এর কোন সংস্করণে আছেন? 10.1 arcpy.daকার্সারের দ্রুত সংস্করণ সহ (ডেটা অ্যাক্সেস) মডিউলটি যুক্ত করেছে ।
blah238

উত্তর:


20

আপনার যদি দ্বিতীয় কার্সার তৈরি parcels.shpকরতে হয় তবে আপনার প্রথম কার্সারের জন্য লুপের বাইরে এটি করুন। এটি যেমন দাঁড়িয়েছে, আপনার স্ক্রিপ্ট প্রতিটি সারিটির জন্য একটি নতুন কার্সার অবজেক্ট তৈরি করছে malls.shpযার মধ্যে প্রসেসিংয়ের সময়টি আপনার জন্য ব্যয় করে।

...
rows = arcpy.UpdateCursor('malls.shp',"","",'ParcelID')
polyrows = arcpy.SearchCursor('parcels.shp')
for row in rows:
    t4 = datetime.datetime.now()
    pt = row.Shape.getPart()
    for polyrow in polyrows:
...

এটা ঠিক ছিল। ধন্যবাদ. এবং তারপরে আমি যখন দ্বিতীয় বারটি পাঠাতে চাই তখন আমার দ্বিতীয় কার্সারে .reset () ব্যবহার করি? দেখে মনে হচ্ছে এটি এখন 1 বার কেবল কার্সর দিয়ে গেছে।
এমডিপি

হুম, আপনার সারিগুলি পুনরায় সেট করার দরকার নেই। স্ক্রিপ্টের শেষে আপনি উভয় সারি বস্তু এবং কার্সার অবজেক্ট মুছে ফেলছেন তা নিশ্চিত করুন। মজার বিষয় না ঘটলে ঘটতে পারে।
জেসন

আমি ভেতরের লুপ এর কার্সার মনে করে প্রতিটি সময় রিসেট যদি এই রুট যেতে করা প্রয়োজন। একটি বিকল্প জন্য আমার উত্তর দেখুন।
blah238

10

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

বিকল্প ওয়ার্কফ্লো যা আপনার পয়েন্ট ফিচার ক্লাসকে ইন-প্লেসে আপডেট করার সময় আরও দ্রুত হতে পারে (স্পেশিয়াল জয়েন কেবল নতুন ফিচার ক্লাসকে আউটপুট দেয়, বিদ্যমানটি আপডেট করে না) হতে পারে:

  1. একটি মধ্যবর্তী (সম্ভবত মেমরির) বৈশিষ্ট্য শ্রেণি তৈরি করতে স্পেশাল জোড় ব্যবহার করুন
  2. ব্যবহারের যোগদান যোগ আপনার বিদ্যমান বিন্দু বৈশিষ্ট্য ক্লাসে অন্তর্বর্তী বৈশিষ্ট্য বর্গ যোগদানের জন্য
  3. বিদ্যমান পয়েন্ট বৈশিষ্ট্য শ্রেণিতে ক্ষেত্রের সাথে যোগ দেওয়া ক্ষেত্রের মানগুলিকে অনুলিপি করতে গণনা ক্ষেত্র বা একটি আপডেটকর্সর ব্যবহার করুন

2
আমি এই বিকল্প কর্মপ্রবাহটি পছন্দ করি - আমি ভালোবাসি যে আমি প্রশ্ন না জিজ্ঞাসা করেও আমি এখানে জিনিসগুলি করার নতুন উপায় শিখছি।
জেসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.