পাইকিজিআইএস-এ সমান্তরাল জিআইএস অপারেশনস?


15

জিআইএস-এ একটি সাধারণ প্রয়োজনীয়তা হ'ল বিভিন্ন ফাইলগুলিতে একটি প্রসেসিং সরঞ্জাম প্রয়োগ করা বা একটি ফাইলের বিভিন্ন বৈশিষ্ট্যের জন্য অন্য একটি ফাইলে একটি প্রক্রিয়া প্রয়োগ করা।

এই অপারেশনগুলির বেশিরভাগটি বিব্রতকরভাবে সমান্তরাল যে গণনার ফলাফলগুলি কোনওভাবেই লুপের কোনও অপারেশনকে প্রভাবিত করে না। শুধু তাই নয় প্রায়শই ইনপুট ফাইলগুলি প্রতিটি স্বতন্ত্র।

পয়েন্টে একটি ক্লাসিক কেস হ'ল বহুভোগযুক্ত ফাইলগুলির বিরুদ্ধে ফাইলগুলি ক্লিপ করার জন্য আকারের ফাইলগুলি টাইলিং আউট করা।

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

import processing
import os
input_file="/path/to/input_file.shp"
clip_polygons_file="/path/to/polygon_file.shp"
output_folder="/tmp/test/"
input_layer = QgsVectorLayer(input_file, "input file", "ogr")
QgsMapLayerRegistry.instance().addMapLayer(input_layer)
tile_layer  = QgsVectorLayer(clip_polygons_file, "clip_polys", "ogr")
QgsMapLayerRegistry.instance().addMapLayer(tile_layer)
tile_layer_dp=input_layer.dataProvider()
EPSG_code=int(tile_layer_dp.crs().authid().split(":")[1])
tile_no=0
clipping_polygons = tile_layer.getFeatures()
for clipping_polygon in clipping_polygons:
    print "Tile no: "+str(tile_no)
    tile_no+=1
    geom = clipping_polygon.geometry()
    clip_layer=QgsVectorLayer("Polygon?crs=epsg:"+str(EPSG_code)+\
    "&field=id:integer&index=yes","clip_polygon", "memory")
    clip_layer_dp = clip_layer.dataProvider()
    clip_layer.startEditing()
    clip_layer_feature = QgsFeature()
    clip_layer_feature.setGeometry(geom)
    (res, outFeats) = clip_layer_dp.addFeatures([clip_layer_feature])
    clip_layer.commitChanges()
    clip_file = os.path.join(output_folder,"tile_"+str(tile_no)+".shp")
    write_error = QgsVectorFileWriter.writeAsVectorFormat(clip_layer, \
    clip_file, "system", \
    QgsCoordinateReferenceSystem(EPSG_code), "ESRI Shapefile")
    QgsMapLayerRegistry.instance().addMapLayer(clip_layer)
    output_file = os.path.join(output_folder,str(tile_no)+".shp")
    processing.runalg("qgis:clip", input_file, clip_file, output_file)
    QgsMapLayerRegistry.instance().removeMapLayer(clip_layer.id())

আমার ইনপুট ফাইলটি 2 জিবি এবং বহুভুজ ক্লিপিং ফাইলটিতে 400+ বহুভুজ রয়েছে তা বাদে এটি ঠিক থাকবে fine ফলাফলের প্রক্রিয়াটি আমার কোয়াড কোর মেশিনে এক সপ্তাহ সময় নেয় takes তিনটি কোর কেবল অলস অবস্থায় রয়েছে।

আমার মাথায় সমাধানটি হ'ল প্রক্রিয়াটি স্ক্রিপ্ট ফাইলগুলিতে রফতানি করা এবং উদাহরণস্বরূপ gnu সমান্তরাল ব্যবহার করে এটিকে অবিচ্ছিন্নভাবে চালানো। তবে কিউজিআইএস অজগর থেকে স্থানীয় কিছু ব্যবহার না করে কিউজিআইএসকে কোনও ওএস নির্দিষ্ট সমাধানে ফেলে দেওয়া লজ্জার বলে মনে হচ্ছে। সুতরাং আমার প্রশ্নটি হ'ল:

আমি কি অজগর কিউজিসের অভ্যন্তরে বিব্রতকরভাবে সমান্তরাল ভৌগলিক ক্রিয়াকলাপকে সমান্তরাল করতে পারি?

যদি তা না হয় তবে সম্ভবত কারও কাছে ইতিমধ্যে এই ধরণের কাজ অ্যাসিক্রোনাস শেল স্ক্রিপ্টগুলিতে প্রেরণের কোড রয়েছে?


কিউজিআইএস-এ মাল্টিপ্রসেসিংয়ের সাথে পরিচিত নয়, তবে এই আরকিজিআইএস-নির্দিষ্ট উদাহরণটি কিছুটা কার্যকর হতে পারে: gis.stackexchange.com/a/20352/753
blah238

বেশ মজার তো. আমি এটি দিয়ে কী করতে পারি তা দেখতে পাবো।
মিঃ বেগুনি

উত্তর:


11

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

parallel my_processing.py {} /path/to/polygon_file.shp ::: input_files*.shp

এটি কোর প্রতি 1 টি কাজ চালাবে।

সমস্ত নতুন কম্পিউটারের একাধিক কোর রয়েছে তবে বেশিরভাগ প্রোগ্রাম প্রকৃতির সিরিয়াল এবং তাই একাধিক কোর ব্যবহার করবে না। তবে, অনেকগুলি কাজ অত্যন্ত সমান্তরাল:

  • একই ফাইলটি অনেকগুলি ফাইলে চালান
  • একটি ফাইলের প্রতিটি লাইনের জন্য একই প্রোগ্রামটি চালান
  • একটি ফাইলের প্রতিটি ব্লকের জন্য একই প্রোগ্রামটি চালান

জিএনইউ সমান্তরাল হ'ল একটি সাধারণ প্যারালালাইজার এবং একই মেশিনে বা আপনার একাধিক মেশিনে ssh অ্যাক্সেস থাকা সমান্তরালে কাজ চালানো সহজ।

যদি আপনার কাছে 32 টি আলাদা চাকরি থাকে তবে আপনি 4 টি সিপিইউতে চালাতে চান, সমান্তরাল করার একটি সরল অগ্রসর উপায় হ'ল প্রতিটি সিপিইউতে 8 টি কাজ চালানো:

সাধারণ সময়সূচী

সিএনইউ সক্রিয় রাখা এবং এভাবে সময় সাশ্রয় করা - জিএনইউ সমান্তরাল পরিবর্তিত হয়ে একটি নতুন প্রক্রিয়া তৈরি করে

জিএনইউ সমান্তরাল শিডিউলিং

স্থাপন

জিএনইউ সমান্তরাল যদি আপনার বিতরণের জন্য প্যাকেজ না থাকে তবে আপনি একটি ব্যক্তিগত ইনস্টলেশন করতে পারেন, যার জন্য রুট অ্যাক্সেসের প্রয়োজন নেই। এটি করে 10 সেকেন্ডের মধ্যে এটি করা যেতে পারে:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

অন্যান্য ইনস্টলেশন বিকল্পের জন্য দেখুন http://git.savannah.gnu.org/cgit/parallel.git/tree/README

আরও জানুন

আরও উদাহরণ দেখুন: http://www.gnu.org/software/parallel/man.html

পরিচিতি ভিডিওগুলি দেখুন: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

টিউটোরিয়ালটি দিয়ে যান: http://www.gnu.org/software/parallel/parallel_tutorial.html

সমর্থন পেতে ইমেল তালিকার জন্য সাইন আপ করুন: https://lists.gnu.org/mailman/listinfo/parallel


এটি এমন কিছু যা আমি চেষ্টা এবং চেষ্টা করতে যাচ্ছিলাম তবে পাইথনটির ভিতরে থাকা আমার সবার পক্ষে এটি দরকার। পপেন বলতে উদাহরণস্বরূপ লাইনটি ব্যবহার করতে পুনরায় লেখার দরকার রয়েছে ... এর মতো কিছু: সাবপ্রসেস আমদানি পোপেন থেকে, পাইপ পি = পোপেন (["সমান্তরাল", "ওজিআর 2ogr", "- ক্লিপসিআরসি", "ক্লিপ_ফाइल * .শ্প", "আউটপুট * .shp "ইনপুট.শ্প"], স্টিডিন = পিআইপিই, স্টডআউট = পিআইপিই, স্ট্ডার = পিআইপিই) সমস্যা হ'ল আমি কীভাবে সিনট্যাক্সটি সঠিকভাবে প্রস্তুত করতে জানি না
মিঃ বেগুনি

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

@ মিঃপুরল আমি মনে করি যে মন্তব্যটি তার নিজেরাই একটি প্রশ্নের উত্তর দেয়। উত্তরটি অবশ্যই কোনও মন্তব্য করতে খুব দীর্ঘ।
ওলে টেঙ্গ

ঠিক আছে, লিঙ্কগুলির জন্য ধন্যবাদ। আমি যদি gnu সমান্তরাল ব্যবহার করে কোনও উত্তর তৈরি করি তবে আমি এটি এখানে পোস্ট করব।
মিঃ বেগুনি

আপনার জন্য একটি ভাল সূত্রটি my_processing.pyপাওয়া যাবে gis.stackexchange.com/a/130337/26897
মিঃ বেগুনি

4

GNU সমান্তরাল পদ্ধতিটি ব্যবহার না করে আপনি পাইথন মিটলিপ্রোসেস মডিউলটি কার্যের পুল তৈরি করতে এবং তা কার্যকর করতে পারেন। এটি পরীক্ষা করার জন্য আমার কাছে কোন QGIS সেটআপে অ্যাক্সেস নেই তবে পাইথন ২.6 এ মাল্টিপ্রসেস যুক্ত করা হয়েছিল যাতে আপনি যদি ২.6 ব্যবহার করছেন বা পরে এটি উপলব্ধ থাকে। এই মডিউলটি ব্যবহার করার জন্য অনলাইনে প্রচুর উদাহরণ রয়েছে।


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

এটা সত্যিই লজ্জাজনক। আমি যদি gnu সমান্তরাল হিসাবে একক pyQGIS ফাংশন মোড়ানো মাল্টিপ্রসেস মডিউলটির উদাহরণ লিখতে পারি তবে আমরা সকলেই চলে যেতে পারি এবং আমরা যা পছন্দ করি তা সমান্তরাল করতে পারি।
মিঃ বেগুনি

আমি সম্মত তবে আমি যেমন বলেছি এই মুহুর্তে আমার কাছে কোনও QGIS এ অ্যাক্সেস নেই।
স্টিভ বার্নেস


@ এমআরপুরল এবং এটি এক gis.stackexchange.com /Qtions/114260/… উদাহরণ দেয়
স্টিভ বার্নস

3

এখানে gnu সমান্তরাল সমাধান। কিছু যত্নের সাথে আপনার কিউজিআইএস ইনস্টলেশনের অভ্যন্তরে বেশিরভাগ ইমব্র্যাসরিয়ালি সমান্তরাল লিনাক্স ভিত্তিক ওজিআর বা সাগা অ্যালগোরিদম তৈরি করা যেতে পারে।

স্পষ্টতই এই সমাধানটির জন্য gnu সমান্তরাল ইনস্টলেশন প্রয়োজন। উবুন্টুতে gnu সমান্তরাল ইনস্টল করতে, উদাহরণস্বরূপ, আপনার টার্মিনালে যান এবং টাইপ করুন

sudo apt-get -y install parallel

এনবি: আমি পপেন বা সাবপ্রসেসে কাজ করার জন্য সমান্তরাল শেল কমান্ডটি পেতে পারি না, যা আমি পছন্দ করতাম, সুতরাং আমি বাশ স্ক্রিপ্টে রফতানি একসাথে হ্যাক করেছি এবং তার পরিবর্তে পোপেনের সাথে এটি চালিয়েছি।

আমি পাইথনে জড়িয়ে থাকা সমান্তরাল ব্যবহার করে এখানে নির্দিষ্ট শেল কমান্ডটি দিচ্ছি

parallel ogr2ogr -skipfailures -clipsrc tile_{1}.shp output_{1}.shp input.shp ::: {1..400}

প্রতিটি {1} {1..400} পরিসীমা থেকে একটি সংখ্যার জন্য অদলবদল হয়ে যায় এবং তারপরে চার শতাধিক শেল কমান্ডগুলি gnu সমান্তরালভাবে আমার i7 এর সমস্ত কোর ব্যবহার করার জন্য পরিচালনা করে :) :)।

এখানে পোস্ট করা উদাহরণটির সমস্যাটি সমাধান করতে আমি লিখেছিলাম আসল পাইথন কোডটি। প্রশ্নের কোড শেষ হওয়ার পরে কেউ এটিকে সরাসরি পেস্ট করতে পারে।

import stat
from subprocess import Popen
from subprocess import PIPE
feature_count=tile_layer.dataProvider().featureCount()
subprocess_args=["parallel", \
"ogr2ogr","-skipfailures","-clipsrc",\
os.path.join(output_folder,"tile_"+"{1}"+".shp"),\
os.path.join(output_folder,"output_"+"{1}"+".shp"),\
input_file,\
" ::: ","{1.."+str(feature_count)+"}"]
#Hacky part where I write the shell command to a script file
temp_script=os.path.join(output_folder,"parallelclip.sh")
f = open(temp_script,'w')
f.write("#!/bin/bash\n")
f.write(" ".join(subprocess_args)+'\n')
f.close()
st = os.stat(temp_script)
os.chmod(temp_script, st.st_mode | stat.S_IEXEC)
#End of hacky bash script export
p = Popen([os.path.join(output_folder,"parallelclip.sh")],\
stdin=PIPE, stdout=PIPE, stderr=PIPE)
#Below is the commented out Popen line I couldn't get to work
#p = Popen(subprocess_args, stdin=PIPE, stdout=PIPE, stderr=PIPE)
output, err = p.communicate(b"input data that is passed to subprocess' stdin")
rc = p.returncode
print output
print err

#Delete script and old clip files
os.remove(os.path.join(output_folder,"parallelclip.sh"))
for i in range(feature_count):
    delete_file = os.path.join(output_folder,"tile_"+str(i+1)+".shp")
    nosuff=os.path.splitext(delete_file)[0]
    suffix_list=[]
    suffix_list.append('.shx')
    suffix_list.append('.dbf')
    suffix_list.append('.qpj')
    suffix_list.append('.prj')
    suffix_list.append('.shp')
    suffix_list.append('.cpg')
    for suffix in suffix_list:
        try:
            os.remove(nosuff+suffix)
        except:
            pass

আমাকে বলুন যে আপনি যখন সমস্ত কোরের পুরো শব্দে আগুন জ্বালিয়ে দেখেন :) তখন এটি সত্যিই কিছু। ওলে এবং জেনু সমান্তরাল নির্মিত দলটিকে বিশেষ ধন্যবাদ Special

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

নির্বিশেষে এই সমাধানটি আমার এবং সম্ভবত আপনি সুন্দরভাবে পরিবেশন করবেন।


স্পষ্টতই একজনের কোডের প্রথম টুকরোতে "প্রসেসিং.রুণালগ" লাইনটি মন্তব্য করা উচিত যাতে ক্লিপটি সমান্তরালে চালানোর আগে ক্রমানুসারে প্রথমে চালিত হয় না। এটি ব্যতীত এটি কেবল প্রশ্নের প্রশ্নের নীচের উত্তর থেকে কোডটি অনুলিপি করা এবং আটকানোর বিষয়।
মিঃ বেগুনি

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