আর্কজিআইএস সরঞ্জাম হিসাবে চালিত পাইথন স্ক্রিপ্টগুলির গতি বাড়ানোর উপায়গুলি [বন্ধ]


31

এটি একটি খুব সাধারণ প্রশ্ন। আমি কেবল ভাবছিলাম যে জিআইএস প্রোগ্রামাররা কীভাবে টিপস এবং ট্রিকস ব্যবহার করে আরকি স্ক্রিপ্টগুলি গতি বাড়িয়েছে যা আপনি সরঞ্জাম বাক্সে আমদানি করে এবং চালনা করেন।

আমি আমার অফিসে জিআইএস ডেটা প্রক্রিয়াতে নন-জিআইএস ব্যবহারকারীদের সহায়তার জন্য বেশিরভাগ লিখিত লিখিত লিখিত কাজ করি। আমি খুঁজে পেয়েছি যে আর্কজিআইএস 10.0 প্রসেসিং সাধারণত 9.3.1 এর চেয়ে ধীর হয় এবং কখনও কখনও পাইথন স্ক্রিপ্ট চালানোর সময় এটি আরও ধীর হয়ে যায়।

আমি একটি স্ক্রিপ্টের একটি বিশেষ উদাহরণ তালিকা বদ্ধ করতে যাচ্ছি যা চালাতে 24 ঘন্টা সময় নেয়। এটি এমন একটি লুপ যা বাফারের প্রতিটি আকারের জন্য একটি বাজেটে একটি রাস্টার ক্ষেত্রটি ট্যাবলেট করে। বাফারের প্রায় 7000 আকার রয়েছে। আমি বিশ্বাস করি না এটি দীর্ঘকাল চলবে। একজন

while x <= layerRecords:

    arcpy.SetProgressorLabel("Tabulating Row: " + str(x) + " of " + str(ELClayerRecords))
    arcpy.SelectLayerByAttribute_management(Buff,"NEW_SELECTION", "Recno = " + str(x))                                  # Selecting the record
    TabulateArea(Buff, "Recno", MatGRID, "VALUE", ScratchWS + "/tab" + str(z) +".dbf", nMatGRIDc)                          # Tabulate the area of the single row

    arcpy.AddMessage ("          - Row: " + str(x) + " completed")
    x = x + 1
    z = z + 1

কেউ এটি বলার আগে, আমি পুরো বাফারে ট্যাবুলেট অঞ্চলটি চালিয়েছি, তবে এটি যদি আরও 1 টি রেকর্ডে চালিত হয় তবে এটি ত্রুটি তৈরি করে। এটি একটি ত্রুটিযুক্ত সরঞ্জাম, তবে আমাকে এটি ব্যবহার করতে হবে।

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

উত্তর:


26

আপনার প্রক্রিয়াটির গতি বাড়ানোর জন্য কয়েকটি সম্ভাব্য পরামর্শ হ'ল:

  1. আর্টিজিআইএস ডেস্কটপটি কখনও না চালিয়ে, স্তর অনুসারে অ্যাট্রিবিউট নির্বাচন করুন পাইথন-কেবল স্ক্রিপ্টে থাকতে পারে। ফাইল-ভিত্তিক রেফারেন্স থেকে আপনার "বাফ" রেফারেন্সটি একটি "আর্কজিআইএস স্তর" রেফারেন্সে রূপান্তর করা দরকার, যার সাথে আর্কজিআইএস নির্বাচনের অনুসন্ধানগুলি প্রক্রিয়া করতে পারে। আপনার "যখন" লুপের উপরে আরকিপি.মেকফিউচারলায়ার_ম্যানেজমেন্ট ("বাফ", "বাফ_লাইর") ব্যবহার করুন এবং তারপরে "বাফ_লায়ার" ব্যবহার করার জন্য লুপের নীচে আপনার রেফারেন্সগুলি পরিবর্তন করুন।

  2. আপনার জিপি অপারেশনগুলির যতটা সম্ভব ইন- মেমরি ওয়ার্কস্পেস ব্যবহার করে যথাসম্ভব প্রক্রিয়া করুন ... আপনার উত্সটিকে স্মৃতিতে স্থানান্তর করতে আরকিপি.কপি ফিচারস_ম্যানেজমেন্ট (শেফফাইল, "ইন_মেমোরি \ #MeMEFEatureClass") ব্যবহার করুন। এটি কেবল তখনই কার্যকর হয় যদি আপনার মেমরিতে প্রয়োজনীয় বৈশিষ্ট্য শ্রেণি (এস) এর সমস্ত পড়ার জন্য পর্যাপ্ত র‍্যাম থাকে। তবে সাবধান থাকুন যে এখানে কিছু জিপি অপারেশন রয়েছে যা ইন_মেমোরি ওয়ার্কস্পেস (উদাহরণস্বরূপ: প্রকল্প সরঞ্জাম) ব্যবহার করে চলতে পারে না।

আর্কজিআইএস 9.3 অনলাইন সহায়তা নিবন্ধ " ইন্টারমিডিয়েট ডেটা এবং স্ক্র্যাচ ওয়ার্কস্পেস " থেকে (নোট করুন, এই ভাষাটি 10.0 এবং 10.1 সহায়তা থেকে সরানো হয়েছে):

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

আর্কজিআইএস 10.1 অনলাইন সহায়তা নিবন্ধ "" ইন-মেমরি ওয়ার্কস্পেস ব্যবহার করে ":

ইন-মেমরি ওয়ার্কস্পেসে আউটপুট লেখার সিদ্ধান্ত নেওয়ার ক্ষেত্রে নিম্নলিখিত বিবেচনাগুলি অবশ্যই করা উচিত:

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

1
এটা সত্যিই চমৎকার! আমি আর্কম্যাপের বাইরে সিলেকশনগুলি ব্যবহার করার জন্য একটি উপায় খুঁজছি কিন্তু, এখনও পর্যন্ত এটি ব্যর্থ হয়েছিল। এই সমস্যার নিরিখে, এটি আসলে আমার সারি প্রতি সময় 20 সেকেন্ড থেকে প্রায় 13 সেকেন্ডে নামিয়ে দেয়। তবে, আমি চারপাশে একটি দ্রুত অন্যান্য কাজ করেছি এবং লুপের মধ্যে মেকফিজার লাইয়ার করেছি এবং এটি 9 সেকেন্ডে নেমে গেছে। বৈশিষ্ট্য স্তরটি ট্যাবুলেটের চেয়ে প্রতিটি আকৃতি থেকে একটি বৈশিষ্ট্য তৈরি করে আমি এটি করেছি। আমি যদি সম্ভব হয় তবে এটি আরও নামিয়ে আনতে চাই তবে ইতিমধ্যে এটি আরও দ্রুত প্রক্রিয়া!
কোডি ব্রাউন 15

# 2 তে উল্লিখিত হিসাবে, কপিরাইটফাইচারগুলি আপনার সোর্স ডেটা ইন_ মেমোরির একটি অনুলিপি তৈরি করতে ব্যবহার করুন, তারপরে ইন_মেমোরি উত্সের বিপরীতে আপনার বৈশিষ্ট্য_ক্লিয়ারটি তৈরি করুন। মেমোরিতে প্রাথমিক কপিটি কয়েক সেকেন্ড আপ-ফ্রন্ট যুক্ত করতে পারে তবে আপনি দেখতে পাচ্ছেন যে কপিফিটচারগুলি + ট্যাবুলেট_আরিয়াসের প্রসেসিংটি আপনার বর্তমান মডেলের চেয়ে দ্রুত মোট প্রসেসিং সময় পেতে পারে।
রায়ানডাল্টন

আমি এটিও চেষ্টা করেছি এবং দেখে মনে হচ্ছে যে সমাধানটি লুপ প্রক্রিয়াটিকে দ্রুততর করে তুলবে তবে, তা হয় না। লুপে বৈশিষ্ট্য স্তর তৈরি করা প্রতি লুপের প্রায় 8-10 সেকেন্ডে ফলাফল দেয়, যখন বৈশিষ্ট্য স্তরটি তৈরি করার আগে লুপের প্রতি লুপের ফলাফল 11 - 14 সেকেন্ডে আসে। আমি খুব নিশ্চিত না যেহেতু আপনার সমাধানটি কেন দ্রুত প্রসেস হবে বলে মনে হচ্ছে। আমার 8 জিবি র‌্যাম রয়েছে, তাই আমি সন্দেহ করি যে সমস্যাটি হবে।
কোডি ব্রাউন 17

লুপের আগে ইন-মেমোরিতে বৈশিষ্ট্যগুলি অনুলিপি করা এবং তারপরে লুপের মধ্যে বৈশিষ্ট্য স্তর তৈরি করা কিছুটা দ্রুত পারফরম্যান্সের ফলস্বরূপ। এটি প্রতিটি লুপের জন্য প্রতি সারি প্রতি 8 সেকেন্ড স্থির থাকে। যা মোট প্রক্রিয়া সময়টি 26 ঘন্টা থেকে 22 এ নেমে যাবে
কোডি ব্রাউন

আপনার ধারণাগুলি যুক্ত করার পরে আমার স্ক্রিপ্ট নাটকীয়ভাবে উন্নত হয়েছে। আপনার এবং প্রত্যেকের সহায়তার জন্য একটি টন ধন্যবাদ!
কোডি ব্রাউন

28

সাধারণ পাইথন অপ্টিমাইজেশন কৌশলগুলি আপনাকে যথেষ্ট পরিমাণে সময় বাঁচাতে পারে।

আপনার স্ক্রিপ্টে হোল্ড আপগুলি যেখানে অন্তর্নির্মিত সিপ্রোফাইল মডিউলটি ব্যবহার করছে তার নিচু অংশ নেওয়ার জন্য সত্যই একটি ভাল কৌশল:

from cProfile import run
run("code") # replace code with your code or function

একটি ছোট ডেটা নমুনা ব্যবহার করে পরীক্ষা করা আপনাকে কোন ফাংশন কলগুলি সবচেয়ে বেশি সময় নিচ্ছে তা নির্ধারণ করার অনুমতি দেবে।

দ্রুত পাইথন কোডের জন্য সাধারণ পয়েন্টার:

  • তালিকা অনুধাবনগুলি লুপিংয়ের চেয়ে সাধারণত দ্রুত হয়
  • জেনারেটরগুলি একবারে পুরো তালিকা তৈরির পরিবর্তে সময়ে একটি আইটেম উত্পাদন করে
  • পাইথন 2 এ রেঞ্জের পরিবর্তে এক্সরেঞ্জ ব্যবহার করুন (3 তে প্রয়োজনীয় নয়)
  • সেটগুলিতে প্রিফর্ম তালিকাগুলি বেরিয়ে আসতে পারে যখন সেটটিতে কোনও আইটেম উপস্থিত রয়েছে কিনা তা নির্ধারণ করার ক্ষেত্রে আসে তবে তালিকাগুলির তুলনায় সাধারণত ধীর হয় যখন এটি তাদের বিষয়বস্তুগুলিতে পুনরাবৃত্তি করতে আসে উত্স
  • কার্যকারিতা উত্সের জন্য ফাংশন কলগুলি ব্যয়বহুল হতে পারে
  • আরও টিপস এবং বিশদটি এখানে পাইথন পারফোমেন্স টিপস এবং এখানে 10 পাইথন অপ্টিমাইজেশন টিপস এবং সমস্যাগুলি দেখুন

আপনার স্ক্রিপ্টের সাথে, আমি আরকপির দিকগুলি সম্পর্কে মন্তব্য করতে পারি না কারণ আমার কাছে এই কম্পিউটারে আরক ইনস্টল করা নেই তবে আপনি কিছুক্ষণ লুপের পরিবর্তে লুপের জন্য চেষ্টা করতে চাইতে পারেন এটির কিছু উন্নতি হয়েছে কিনা তা। এছাড়াও x = x + 1 এক্স + = 1 হিসাবে লেখা যেতে পারে:

for record in layerRecords:
arcpy.SetProgressorLabel("Tabulating Row: " + str(x) + " of " + str(ELClayerRecords))
arcpy.SelectLayerByAttribute_management(Buff,"NEW_SELECTION", "Recno = " + str(x))                                  # Selecting the record
TabulateArea(Buff, "Recno", MatGRID, "VALUE", ScratchWS + "/tab" + str(z) +".dbf", nMatGRIDc)                          # Tabulate the area of the single row

arcpy.AddMessage ("          - Row: " + str(x) + " completed")
x+=1
y+=1

1
আপনার শেষ বুলেটে থাকা দুটি লিঙ্ক আমি ব্যবহার করেছি এবং কয়েকটি দ্রুত সমাধানের সাথে আমার স্ক্রিপ্টটিকে সত্যই সহায়তা করতে সক্ষম হয়েছি!
কোডি ব্রাউন 15

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

13

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

স্ক্রিপ্টটি পুরোপুরি আর্কম্যাপের বাইরে চালানো আরও দ্রুততর হতে পারে। যদি প্রক্রিয়া চলাকালীন কোনও মানচিত্রের প্রয়োজন না হয় তবে আর্কম্যাপ ব্যবহার করবেন না।


আমি খুঁজে পেয়েছি যে আর্ককিগালগ থেকে কোনও মডেলের ভিতরে স্ক্রিপ্ট চালানো (নিজেই একটি Calculate Valueডায়ালগের অভ্যন্তরে) আর্কম্যাপের আরকপাই উইন্ডো থেকে একই স্ক্রিপ্টটি চালানোর চেয়ে দ্রুত প্রক্রিয়া করবে। যদিও এটি নিখুঁতভাবে একটি উপাখ্যানীয় পর্যবেক্ষণ।
সিন্ডি জয়কুমার

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

দুর্ভাগ্যক্রমে নির্বাচিতটি আর্কম্যাপের বাইরে কাজ করে না এবং এটি প্রয়োজনীয় কারণ আমার আকারের দ্বারা ট্যাবুলেট আকারটি করা দরকার।
কোডি ব্রাউন

3
@ কোডিবাউন- আপনি আর্কম্যাপ সেশনের বাইরে কাজ না করা নির্বাচন করা সম্পর্কে ভুল। MakeFeatureLayer সরঞ্জামটি ব্যবহার সম্পর্কে আমার প্রতিক্রিয়া দেখুন।
রায়ানডাল্টন

রায়ান ঠিক আছে। যখন নির্বাচিত সরঞ্জামটি নিজে ব্যবহার করা হয় এটি আপনার স্থানিয় ডেটা বা টেবিল ডেটার একটির একটি সারণী দর্শন তৈরি করে। এটি মডেলবায়েল্ড বা স্ক্রিপ্টে ব্যবহার করার সময় আপনাকে একটি দৃষ্টিভঙ্গি তৈরি করতে হবে এবং আপনার ক্ষেত্রে এটি MakeFeatureLayer সরঞ্জাম ব্যবহার করে তৈরি করুন।
dchaboya

6

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

ভাল তারা আমার শীর্ষ টিপস! :)


2
এই উত্তরটি কিছুটা কাদা দিতে, পাইথন আইডিই থেকে স্ক্রিপ্টগুলি চালানোর সময় অনেকে ভেরিয়েবল এবং অন্যান্য বিভিন্ন ডিবাগিং সহায়তা দেখার জন্য একটি ট্রেসব্যাক ফাংশন ইনজেক্ট করেন। এই ফাংশনটি স্ক্রিপ্টগুলিকে ব্যাপকভাবে ধীর করতে পারে যদি এটি সমস্ত সময় হিসাবে ডাকা হয় এবং অনেক সময় এটি ব্যবহারকারীর হস্তক্ষেপ ছাড়াই স্পষ্টভাবে ইনস্টল করা হয়। একটি নির্দিষ্ট প্যাথলজিকাল কেস আমি দেখেছি যেখানে আর্কম্যাপে পাইথন স্ক্রিপ্টটি 4 মিনিটে চলেছিল, উইং আইডিই থেকে একই স্ক্রিপ্টটি 3 ঘন্টা সময় নেয়। উইং ছাড়াই পাইথন.এক্সই থেকে চালানো মাত্র এটি আবার back-৩০ মিনিটের রানটাইম টেরিটরিয়ায় ফিরে যায়।
জেসন শায়িয়ার

1
আরআম্যাপে আমার স্ক্রিপ্টগুলি টিউন করার জন্য আমার মাথাব্যথা ছিল, কখনও কখনও আমি সম্পূর্ণরূপে পারি না, যতক্ষণ না আমি পাইস্ক্রিপ্টারের দিকে ফিরে যাই এটি কোনও অপ্টিমাইজেশন টিপ ব্যবহার না করে আর্কম্যাপের তুলনায় মৃত্যুদন্ডের সময়কে স্ল্যাশ করতে পারে।
জিওজেক

@ জেসনশায়ার এই উইন্ডোজটি বন্ধ করার জন্য আপনি কি উইংয়ের টুইটগুলি খুঁজে পেয়েছেন? আমি নিশ্চিত যে একটি আছে।
কর্টিস দাম

5

আরকিপি মন্তব্য করার চেষ্টা করুন ressSetProgressorLabel এবং দেখুন আপনি কত গতি বাড়ান। আমি খুঁজে পেয়েছি যে কোনও স্ক্রিন আউটপুট, ডস ড্যাজে ফিরে ফিরে প্রসেসিংয়ের সময়কে তীব্রভাবে ধীর করে দেয়। যদি আপনার যদি সত্যই এই আউটপুটটি দেখতে হয় তবে প্রতিটি এনটি লুপটি দেখানোর চেষ্টা করছেন।


4

নিশ্চিত হয়ে নিন যে আপনি যে কোনও import xxxxলাইন ব্যবহার করছেন না তা মুছে ফেলেছেন।

(যেমন আপনি যদি এখনও কোনও গাণিতিক ফাংশন ব্যবহার না import Mathকরেন তবে স্ক্রিপ্ট লোডিং থেকে এটি কিছুটা সময় নেবে)

যদিও এটি একক স্ক্রিপ্টগুলিতে চালিত হয় (যেমন আপনার) এটিতে দুর্দান্ত প্রভাব ফেলবে না, তবে এটি যে কোনও স্ক্রিপ্টগুলি ঘন ঘন এবং পুনরাবৃত্তির সাথে চালিত হবে তার প্রভাব ফেলবে।


7
আমি সন্দেহ করি যে কোনও মানক পাইথন মডিউলটি আরকি মডিউলটি আরম্ভ করতে সময় লাগে তার এক হাজারতমেরও বেশি সময় নেয়।
blah238

1
@ blah238 import Mathসম্ভবত একটি খারাপ উদাহরণ ছিল। বৃহত্তর কিছু আরকপাই লাইব্রেরিগুলি অবশ্য লোড হতে যথেষ্ট পরিমাণ সময় নেয়।
nagytech

1
এটি এখনও কয়েক সেকেন্ডের (সর্বাধিক!) শেভ করে, ঘন্টা নয়
মাইক টি

1
@ মাইকটিউইজ স্ক্রিপ্টগুলির জন্য যা ঘন ঘন এবং পুনরাবৃত্তিজনকভাবে চালিত হয়, কয়েক সেকেন্ড / কয়েক সপ্তাহের মধ্যে কয়েক সেকেন্ড যোগ হয়ে যায় যদিও এই ওপির মূল সমস্যাটি সমাধান করা যায় না, তবে তিনি সাধারণ টিপস চেয়েছিলেন।
নাগেইটেক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.