বড় ডেটার জন্য পাইথন কোডটি স্ট্রিমলাইন করে


34

আমার কাছে পাইথন কোড রয়েছে যা নিম্নলিখিত কর্মপ্রবাহের মাধ্যমে পয়েন্ট শেফফাইলগুলি ডিজাইন করার জন্য ডিজাইন করা হয়েছে:

  1. পয়েন্টগুলি মার্জ করুন
  2. পয়েন্টগুলি একীভূত করুন, যেমন একে অপরের 1 মিটারের মধ্যে যে কোনও পয়েন্ট এক বিন্দুতে পরিণত হয়
  3. বৈশিষ্ট্য স্তর তৈরি করুন, যেখানে z <10 সহ পয়েন্টগুলি নির্বাচন করা হয়েছে
  4. বাফার পয়েন্টস
  5. বহুভুজ থেকে রাস্টার 1 মি রেজোলিউশন
  6. পুনর্গঠিত করুন, যেখানে 1 - 9 = 1; নোডাটা = 0

প্রতিটি শেফফাইলে প্রায় 250,000 থেকে 350,000 পয়েন্ট থাকে ~ 5x7 কিমি covering ইনপুট হিসাবে ব্যবহৃত পয়েন্ট ডেটা গাছের অবস্থানের প্রতিনিধিত্ব করে। প্রতিটি পয়েন্ট (অর্থাত্ গাছ) এর সাথে একটি "জেড" মান থাকে যা মুকুট ব্যাসার্ধকে উপস্থাপন করে এবং বাফার প্রক্রিয়াতে ব্যবহৃত হয়। আমার উদ্দেশ্য হ'ল চাঁদীর কভারটি বর্ণনা করে একটি রাস্টার উত্পাদন করতে একটি পৃথক প্রক্রিয়াতে চূড়ান্ত বাইনারি আউটপুট ব্যবহার করা।

আমি চারটি শেফফাইল দিয়ে একটি পরীক্ষা চালিয়েছি এবং এটি একটি 700 এমবি রাস্টার তৈরি করেছে এবং 35 মিনিট (আই 5 প্রসেসর এবং 8 জিবি র‌্যাম) নিয়েছে। আমার এই প্রক্রিয়াটি 3500 শেফফাইলে চালানোর দরকার হবে তা দেখে, প্রক্রিয়াটি সহজ করার জন্য আমি কোনও পরামর্শের (সংযুক্ত কোড দেখুন) প্রশংসা করব। সাধারণভাবে বলতে গেলে, জিওপ্রসেসিং বিগ ডেটা মোকাবেলার সেরা উপায় কী? আরও সুনির্দিষ্টভাবে বলা যায় যে কোড বা ওয়ার্কফ্লোতে কোনও টুইট রয়েছে যা দক্ষতা বাড়াতে সহায়তা করতে পারে?

সম্পাদনা করুন :

জিওপ্রসেসিং কাজের জন্য সময় (মোটের%):

  • মার্জ = 7.6%
  • একীভূত = 7.1%
  • লির থেকে বৈশিষ্ট্য = 0
  • বাফার = 8.8%
  • পলি থেকে রাস্টার = 74.8%
  • পুনর্গঠিত = 1.6%

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

# Import arcpy module
import arcpy

# Check out any necessary licenses
arcpy.CheckOutExtension("spatial")

# Script arguments
temp4 = arcpy.GetParameterAsText(0)
if temp4 == '#' or not temp4:
    temp4 = "C:\\gdrive\\temp\\temp4" # provide a default value if unspecified

Reclassification = arcpy.GetParameterAsText(1)
if Reclassification == '#' or not Reclassification:
    Reclassification = "1 9 1;NODATA 0" # provide a default value if unspecified

Multiple_Value = arcpy.GetParameterAsText(2)
if Multiple_Value == '#' or not Multiple_Value:
    Multiple_Value = "C:\\t1.shp;C:\\t2.shp;C:\\t3.shp;C:\\t4.shp" # provide a default value if unspecified

# Local variables:
temp_shp = Multiple_Value
Output_Features = temp_shp
temp2_Layer = Output_Features
temp_Buffer = temp2_Layer
temp3 = temp_Buffer

# Process: Merge
arcpy.Merge_management(Multiple_Value, temp_shp, "x \"x\" true true false 19 Double 0 0 ,First,#,C:\\#########omitted to save space

# Process: Integrate
arcpy.Integrate_management("C:\\gdrive\\temp\\temp.shp #", "1 Meters")

# Process: Make Feature Layer
arcpy.MakeFeatureLayer_management(temp_shp, temp2_Layer, "z <10", "", "x x VISIBLE NONE;y y VISIBLE NONE;z z VISIBLE NONE;Buffer Buffer VISIBLE NONE")

# Process: Buffer
arcpy.Buffer_analysis(temp2_Layer, temp_Buffer, "z", "FULL", "ROUND", "NONE", "")

# Process: Polygon to Raster
arcpy.PolygonToRaster_conversion(temp_Buffer, "BUFF_DIST", temp3, "CELL_CENTER", "NONE", "1")

# Process: Reclassify
arcpy.gp.Reclassify_sa(temp3, "Value", Reclassification, temp4, "DATA")

3
সময়ের বেশিরভাগ অংশ এক বা কয়েক পদক্ষেপে চলছে কিনা তা প্রতিষ্ঠিত করার জন্য এটি কিছু পারফরম্যান্সের টাইমিং কোডটি রাখার উপযুক্ত হতে পারে - যাতে সেগুলি চেষ্টা করার জন্য এবং পারফরম্যান্স লাভগুলি খুঁজে পেতে মনোনিবেশ করা যায়
পলিজিও

5
আমি মনে করি না আপনি যদি অর্কিপি ব্যবহার চালিয়ে যান তবে পারফরম্যান্সের উন্নতি করার জন্য আপনার কাছে অনেক বিকল্প রয়েছে। এটি করতে আপনি অন্যান্য সরঞ্জামগুলির দিকে নজর দিতে পারেন? এফএমই বা পোস্টজিসের মতো সরঞ্জামগুলি?
tmske

3
এটি পিক্সেল ধরণের কী ব্যবহৃত হচ্ছে তা পরিষ্কার নয়, তবে যদি এটি "বাইট" হয় (যা এটি হওয়া উচিত) তবে কাঁচা ডেটা স্টোরেজ প্রতি রাস্টারে 5000x7000 = 35Mb (~ 33.4MB) হবে, যা আসলে এত বড় নয়। যাইহোক, 3500 এর পরবর্তী মাত্রা (সময়ের মাত্রা?) মোট কাঁচা আকার GB 114 গিগাবাইটে বাড়িয়েছে।
মাইক টি

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

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

উত্তর:


10

কিছু অ্যালগরিদম পরিবর্তন যা আপনাকে সহায়তা করবে।

একত্রীকরণ বা সংহত করার আগে প্রথমে আপনার নির্বাচনকে কার্যকর করুন। এটি সবচেয়ে ব্যয়বহুল পরবর্তী কার্যগুলিতে উল্লেখযোগ্যভাবে হ্রাস পাবে।

মার্জ এবং সংহত দুটি স্মৃতিই ব্যয়বহুল, সুতরাং আপনি বৈশিষ্ট্য বর্গগুলি আনার সাথে সাথে বৈশিষ্ট্যগুলি মুছে ফেলাতে চান এবং সংযুক্তির আকার রাখতে এবং সংহত করার জন্য বাইনারি গাছে আপনার মার্জগুলি করার চেষ্টা করুন। উদাহরণস্বরূপ চারটি শেফফাইলের জন্য আপনি দুটি শেফফিলগুলি একীভূত করে একীকরণ করেছেন; আরও দুটি শেফফাইল একীভূত করুন এবং সংহত করুন; দুটি ফলাফল বৈশিষ্ট্য ক্লাস একীভূত এবং সংহত।

আপনার কাজের সারিটি শেফফিল রেফারেন্সগুলির সারি হিসাবে শুরু হয়। ফলাফলগুলি রাখার জন্য আপনার একটি ফলাফলের সারিও রয়েছে। আপনার সমান্তরাল প্রক্রিয়াকরণ কর্মীদের জন্য রান () পদ্ধতিটি এই ক্রিয়াকলাপগুলি করবে: দুটি আইটেম সারি থেকে দূরে সরিয়ে নিন। যদি কোনও আইটেম না নেওয়া হয় (সারি খালি থাকে) তবে কর্মীকে শেষ করুন। যদি একটি আইটেম নেওয়া হয়, সেই আইটেমটি সরাসরি ফলাফলের সারিতে রাখুন।

যদি প্রতিটি আইটেমের জন্য দুটি আইটেম নেওয়া হয়: এটি যদি শেফফাইল হয় তবে z <10 এর জন্য নির্বাচন করুন এবং একটি ইন-মেমরি বৈশিষ্ট্য শ্রেণি তৈরি করুন; অন্যথায়, এটি ইতিমধ্যে একটি ইন-মেমরি বৈশিষ্ট্য শ্রেণি এবং নির্বাচনের পদক্ষেপটি এড়িয়ে চলে। একটি নতুন ইন-মেমরি বৈশিষ্ট্য শ্রেণি তৈরি করতে দুটি ইন_মেমোরি বৈশিষ্ট্য শ্রেণিটি মার্জ করুন। মূল দুটি বৈশিষ্ট্য শ্রেণি মুছুন। নতুন বৈশিষ্ট্য ক্লাসে সংহতকরণ কার্যকর করুন। ফলাফল সারিতে বৈশিষ্ট্যযুক্ত শ্রেণি রাখুন।

তারপরে লুপের সময় একটি বাইরের চালান। লুপটি শেফফাইল সারি দিয়ে শুরু হয় এবং 1 এর চেয়েও বেশি দৈর্ঘ্যের জন্য পরীক্ষা করে It যদি ফলাফলের সারিটির দৈর্ঘ্য 1 এর চেয়ে বেশি হয়, তবে লুপটি ফলাফলের সারি 1 ইন_ মেমরি বৈশিষ্ট্য শ্রেণি না হওয়া পর্যন্ত শ্রমিকদের মধ্য দিয়ে অন্য সমান্তরাল প্রক্রিয়াকরণ চালায়।

উদাহরণস্বরূপ আপনি যদি 3500 শেফফাইল দিয়ে শুরু করেন তবে আপনার প্রথম সারিতে 3500 টি কাজ থাকবে। সেকেন্ডে 1750 কাজ থাকবে। 875, 438, 219, 110, 55, 28, 14, 7, 4, 2, 1. আপনার বড় বাধা স্মৃতি হয়ে থাকবে। আপনার যদি পর্যাপ্ত মেমরি না থাকে (এবং যদি এটি হয় তবে প্রথম ফলাফলের সারি তৈরিতে আপনি মেমরির বাইরে চলে যাবেন), তারপরে আপনার অ্যালগরিদমটি একবারে 2 টিরও বেশি বৈশিষ্ট্য শ্রেণিগুলিতে মার্জ করার জন্য সংহত করুন, যা সংঘবদ্ধ হবে দীর্ঘতর প্রক্রিয়াজাতকরণের সময়ের বিনিময়ে আপনার প্রথম ফলাফলের সারির আকার। Allyচ্ছিকভাবে, আপনি আউটপুট ফাইল লিখতে এবং ইন_মেমোরি বৈশিষ্ট্য ক্লাস ব্যবহার করে এড়িয়ে যেতে পারেন। এটি আপনাকে যথেষ্ট ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে পড়ে যাবে but

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


আপনার ডেটা মেমরির সাথে ফিট করে যদি ইন_মেমরি ওয়ার্কস্পেস ব্যবহারের জন্য +1 । এটি জিওপ্রসেসিং অপারেশনগুলিকে উল্লেখযোগ্যভাবে গতি দেয়।
রায়ানডাল্টন

এটি ভাল জিনিস। আমি মনে করি এটি একটি চিত্র এবং কিছু psuedocode (বা বাস্তব কোড!) দিয়ে আরও ভাল হতে পারে।
blah238

হ্যাঁ, আমি ইচ্ছা করি কোড নিয়ে প্রতিশ্রুতি দেওয়ার জন্য আমার কিছুটা সময় ছিল। আমার যাই হোক না কেন একটি নতুন সমান্তরাল প্রক্রিয়াকরণ ডেমো স্ক্রিপ্ট লিখতে হবে।
blord-castillo

14

আমি প্রথমে যা করব তা হ'ল আপনি সিপিইউ -, মেমোরি - বা আইও-সীমাবদ্ধ কিনা তা অনুভব করার জন্য উইন্ডোজ in-এর রিসোর্স মনিটরের মতো কিছু বা ভিস্তা / এক্সপি-তে পারফোন ব্যবহার করে আপনার সিস্টেমের রিসোর্স ব্যবহারের উপর নজর রাখা ।

আপনি যদি স্মৃতিশক্তি বা IO- আবদ্ধ হন তবে সম্ভবত হার্ডওয়্যার আপগ্রেড করতে, সমস্যার আকার হ্রাস করতে, বা পুরোপুরি পদ্ধতির পরিবর্তন করতে পারে এমন খুব কমই হতে পারে।

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

সাধারণভাবে বহুতল প্রসেসিং এবং সমান্তরালতার কৌশলটি একটি ভাল বিভাজন স্কিম সন্ধান করছে যা:

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

এই উত্তরে আমি যে স্ক্রিপ্টটি তৈরি করেছি তা আপনি একটি প্রাথমিক পয়েন্ট হিসাবে ব্যবহার করতে পারেন: আরকিজিআইএস ডেস্কটপের জন্য আরকিপি / পাইথনে বিল্ডিং শ্যাডো উত্পাদনের জন্য পোর্টিং এভিনিউ কোড?

এই ইএসআরআই জিওপ্রসেসিং ব্লগ পোস্টটিও দেখুন: পাইথন মাল্টিপ্রসেসিং - পদ্ধতির এবং বিবেচনাগুলি

আমি মনে করি যে আপনি যে সরঞ্জামগুলির সাথে কাজ করছিলেন তার চেয়ে বেশি "ব্ল্যাক বক্স" আপনি যে সরঞ্জামগুলি ব্যবহার করছেন তার প্রকৃতির কারণে আপনার কেস আরও চ্যালেঞ্জ হয়ে উঠবে। সম্ভবত NumPy অ্যারে নিয়ে কাজ করা কার্যকর হতে পারে।

আপনি আরকিপি ছাড়িয়ে দেখতে চাইলে আমি কিছু আকর্ষণীয় পড়ার উপাদানও পেয়েছি:

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