সিপিইউ ব্যবহার সর্বাধিক করা হচ্ছে


9

আমার স্ক্রিপ্ট বহুভুজ দিয়ে রেখা ছেদ করছে। এটি দীর্ঘ প্রক্রিয়া যেহেতু 3000 টিরও বেশি লাইন এবং 500000 এরও বেশি বহুভুজ রয়েছে। আমি পাইস্ক্রিপ্টার থেকে মৃত্যুদন্ড কার্যকর করেছি:

# Import
import arcpy
import time

# Set envvironment
arcpy.env.workspace = r"E:\DensityMaps\DensityMapsTest1.gdb"
arcpy.env.overwriteOutput = True

# Set timer
from datetime import datetime
startTime = datetime.now()

# Set local variables
inFeatures = [r"E:\DensityMaps\DensityMapsTest.gdb\Grid1km_Clip", "JanuaryLines2"]
outFeatures = "JanuaryLinesIntersect"
outType = "LINE"

# Make lines
arcpy.Intersect_analysis(inFeatures, outFeatures, "", "", outType)

#Print end time
print "Finished "+str(datetime.now() - startTime)


আমার প্রশ্ন: সিপিইউ 100% করার কাজ করার কোনও উপায় আছে কি? এটি সর্বদা 25% এ চলছে। আমি অনুমান করি যে প্রসেসরটি 100% এ থাকলে স্ক্রিপ্টটি দ্রুত চলবে। ভুল অনুমান?
আমার যন্ত্রটি হ'ল:

  • উইন্ডোজ সার্ভার 2012 আর 2 স্ট্যান্ডার্ড
  • প্রসেসর: ইনটেল জিওন সিপিইউ E5-2630 0 @ 2.30 গিগাহার্টজ 2.29 গিগাহার্টজ
  • ইনস্টল মেমরি: 31,6 জিবি
  • সিস্টেমের ধরণ: -৪-বিট অপারেটিং সিস্টেম, x64- ভিত্তিক প্রসেসর


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


আমি দৃ strongly়ভাবে মাল্টি-থ্রেডিংয়ের জন্য যেতে পরামর্শ দেব। এটি সেট আপ অপ্রয়োজনীয় কিন্তু প্রচেষ্টা ক্ষতিপূরণ চেয়ে বেশি হবে।
অলোক ঘা

1
আপনার বহুভুজগুলিতে আপনি কোন ধরণের স্থানিক সূচক প্রয়োগ করেছেন?
কर्क কুইকেনডাল

1
এছাড়াও, আপনি কি আর্কজিআইএস প্রো এর সাথে একই অপারেশনটি চেষ্টা করেছেন? এটি 64 বিট এবং মাল্টিথ্রেডেড সমর্থন করে। আমি বিস্মিত হই যদি এটি একাধিক থ্রেডকে ছেদ করার পক্ষে যথেষ্ট স্মার্ট, তবে চেষ্টা করার মতো।
কર્ક কুইকেনডাল

বহুভুজ বৈশিষ্ট্য শ্রেণীর এফডিওএস শেপ নামে একটি স্থানিক সূচক রয়েছে। আমি এই সম্পর্কে চিন্তা না। আমি অন্য একটি তৈরি করা উচিত? এটা কি যথেষ্ট নয়?
ম্যানুয়েল ফ্রিয়াস

1
যেহেতু আপনি প্রচুর র‍্যাম পেয়েছেন ... আপনি কি বহুভুজগুলিকে একটি মেমরির ফিচারক্লাসে অনুলিপি করার চেষ্টা করেছিলেন এবং তারপরে লাইনগুলি ছেদ করেছেন? বা যদি এটি ডিস্কে রাখে, আপনি কি এটি সংক্ষেপণের চেষ্টা করেছেন? মনে হয় কমপ্যাক্ট করা i / o এর উন্নতি করে।
কर्क কুইকেনডাল

উত্তর:


13

আমাকে অনুমান করতে দিন: আপনার সিপুতে 4 টি কোর রয়েছে, সুতরাং 25% সিপিইউ ব্যবহার হয়, একটি কোরের 100% ব্যবহার হয় এবং 3 টি নিষ্ক্রিয় কোর থাকে।

সুতরাং কেবলমাত্র সমাধানটি হ'ল কোডকে বহু থ্রেড করা, তবে এটি কোনও সহজ কাজ নয়।


4
CPU- র সে উল্লেখ 6 কোর এবং 12 থ্রেড ব্যবহার করে।
কার্স্টেন

5
হাই, আমি নামতে পারি না তবে আমি চাই! পাইথনের একটি জিল রয়েছে দুর্ভাগ্যক্রমে তাই আপনি মোটেও মাল্টিথ্রিড স্টাফ করতে পারবেন না (সিস্কলে কোনও থ্রেড ব্লক হয়ে গেলে জিআইএল আনলক করা ভাল আপনিই করতে পারেন)
আলেক টিল

2
@ অ্যালেক্সটিল আপনি অবশ্যই জিতন বা multiprocessingমডিউল সহ উদাহরণস্বরূপ পারেন ।
ডানফোন

@ এলিস যাচ্ছেন "ওহ হ্যাঁ, আপনি পাইথনটিতে পুরোপুরি এটি করতে পারেন, যদি পাইথন দ্বারা আপনি বোঝাচ্ছেন জাইথন" গণনা করা হয় না। আমাকে মাল্টিপ্রসেসিংয়ে সন্ধান করতে হবে, কোনও আমদানিতে কি পাইথন পাইথনকে পুনর্বিবেচনার ক্ষমতা থাকতে পারে?
অ্যালেক টিলে

@ অ্যালকিটেল এটি প্রক্রিয়াগুলিকে উত্সাহ দেয় (যা সমান্তরালতা করার এক উপায়)। multiprocessingমডিউলটির ডকুমেন্টেশন দেখুন ।
রাইটফোল্ড

13

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

যদি ই: একটি নেটওয়ার্ক ড্রাইভ হয়, তবে এটি অপসারণ করা প্রথম পদক্ষেপ। যদি এটি কোনও উচ্চ পারফরম্যান্স ডিস্ক না হয় (<7 এসএমস সন্ধান করে), তবে এটি দ্বিতীয় হবে। বহুভুজ স্তরটিকে একটি in_memoryওয়ার্কস্পেসে অনুলিপি করার মাধ্যমে আপনি কিছু সুবিধা অর্জন করতে পারেন তবে সেই সুবিধাটি বহুভুজ বৈশিষ্ট্য শ্রেণীর আকারের উপর নির্ভরশীল এবং আপনি 64৪-বিট ব্যাকগ্রাউন্ড প্রসেসিং ব্যবহার করছেন কিনা তা নির্ভর করে।

আই / ও থ্রুপুট অনুকূলিতকরণ প্রায়শই জিআইএসের পারফরম্যান্সের মূল চাবিকাঠি, সুতরাং আমি আপনাকে সিপিইউ মিটারের দিকে কম মনোযোগ দেওয়ার এবং নেটওয়ার্ক এবং ডিস্ক মিটারগুলিতে বেশি মনোযোগ দেওয়ার পরামর্শ দিই।


4

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


3

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

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

https://geonet.esri.com/docs/DOC-3824


এভাবেই যাওয়ার পথ মনে হচ্ছে! আপনার স্ক্রিপ্টটি ঠিকঠাক কাজ করে তবে এটিকে আমার স্ক্রিপ্টের সাথে কাজ করতে কীভাবে এটি পরিবর্তন করতে হয় তা আমি জানি না। আরও ভাল, আমি বহুভুজ এবং লাইনের সাহায্যে একটি ট্যাবুলেট ছেদ করার কথা ভাবছিলাম। কোন ধারণা?
ম্যানুয়েল Frias

3

যেমনটি আগে বলা হয়েছিল আপনার মাল্টিপ্রসেসিং বা থ্রেডিং ব্যবহার করা উচিত । কিন্তু এখানে সতর্কতা আসে: সমস্যাটি অবশ্যই বিভাজ্য! তাহলে https://en.wikedia.org/wiki/Divide_and_conquer_algorithms এ একবার দেখুন ।

যদি আপনার সমস্যা বিভাজ্য হয় তবে আপনি আরও এগিয়ে যেতে পারেন:

  • প্রক্রিয়া / থ্রেডের জন্য আপনি ইনপুট ডেটা সঞ্চয় করেন এমন একটি সারি তৈরি করুন
  • ফলাফলগুলি যেখানে সঞ্চিত থাকে সেখানে একটি সারি তৈরি করুন
  • এমন একটি ফাংশন বা শ্রেণি তৈরি করুন যা প্রক্রিয়া / থ্রেড হিসাবে ব্যবহৃত হতে পারে যা আমাদের সমস্যা সমাধান করে

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


3

আমি 21513 লাইন এবং 498596 বহুভুজ ব্যবহার করে এটি পরীক্ষা করার সিদ্ধান্ত নিয়েছি। আমি এই স্ক্রিপ্টটি ব্যবহার করে মাল্টিপ্রসেসর পদ্ধতির (আমার মেশিনে 12 টি প্রসেসর) পরীক্ষা করেছি:

import arcpy,os
import multiprocessing
import time
t0 = time.time()
arcpy.env.overwriteOutput = True
nProcessors=4
folder=r'd:\scratch'

def function(inputs):
        nGroup=inputs[0]
        pGons=inputs[1]
        lines=inputs[2]
        outFeatures = '%s%s%s_%i.shp' %(folder,os.sep,'inters',nGroup)
        fids= tuple([i for i in range(nGroup,500000,nProcessors-1)])
        lyr='layer%s'%nGroup
        query='"FID" in %s' %str(fids)
        arcpy.MakeFeatureLayer_management(pGons,lyr,query)
        arcpy.Intersect_analysis([lines,lyr], outFeatures)
        return outFeatures
if __name__ == "__main__":
        inPgons='%s%s%s' %(folder,os.sep,'parcels.shp')
        inLines='%s%s%s' %(folder,os.sep,'roads.shp')
        m,bList=0,[]
        for i in range(nProcessors):
                bList.append([i,inPgons,inLines])
        pool = multiprocessing.Pool(nProcessors-1)
        listik=pool.map(function, bList)
##      apply merge here
        print listik
        print ('%i seconds' %(time.time()-t0))

ফলাফল, সেকেন্ড:

  • সাধারণ স্থানীয় হার্ড ড্রাইভ - 191
  • সুপারফাস্ট লোকাল ড্রাইভ - 220
  • নেটওয়ার্ক ড্রাইভ - 252

মজাদার বিষয়টি mxd থেকে জিওপ্রসেসিং সরঞ্জামটি ব্যবহার করে মাত্র 87 সেকেন্ড সময় নিয়েছিল। আমার পুলটিতে যাওয়ার সাথে সম্ভবত কিছু ভুল ...

যেহেতু কেউ দেখতে পাবে আমি টাস্ককে বিভাজনযোগ্য করার জন্য (0, 4, 8,12… 500000) এর বদলে কুৎসিত ক্যোয়ারী এফআইডি ব্যবহার করেছি।

এটি সম্ভব যে প্রাক-গণনা করা ক্ষেত্রের ভিত্তিতে ক্যোয়ারী, যেমন সিএফআইএলডি = 0 সময়কে অনেক হ্রাস করবে।

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


1
হ্যাঁ আপনি একটি তালিকা ব্যবহার করছেন যা লকিংয়ের সমস্যাগুলির সাথে আসে। একটি মাল্টিপ্রসেসিং.কুই চেষ্টা করুন। কর্মী প্রসেসগুলিতে স্টাফ না লেখার চেষ্টা করুন, তবে আপনি যে ডেটাটি লিখতে চান তা দিয়ে একটি আউটপুট সারি তৈরি করুন এবং এটি একটি লেখক প্রক্রিয়া দ্বারা করতে দিন।
বেনিয়ামিন

3

আমি পাইস্ক্রিপ্টারের সাথে পরিচিত নই, তবে এটি যদি সিপথন সমর্থন করে তবে সমস্যাটি নিজেই বিভাজ্য না হওয়া পর্যন্ত আপনার মাল্টিপ্রসেসিং করা উচিত এবং মাল্টি-থ্রেডিংয়ের জন্য নয় (অন্যরা ইতিমধ্যে এটি উল্লেখ করেছেন)।

সিপথনের একটি গ্লোবাল ইন্টারপ্রেটার লক রয়েছে যা একাধিক থ্রেড আপনার ক্ষেত্রে আনতে পারে এমন কোনও সুবিধা বাতিল করে দেয় ।

নিশ্চিতভাবে অন্যান্য প্রসঙ্গে পাইথন থ্রেডগুলি দরকারী তবে আপনি সিপিইউতে আবদ্ধ না হন এমন ক্ষেত্রে।


1

আমার প্রশ্ন হ'ল 100% এ সিপিইউ কাজ করার উপায় আছে কি?

আপনার সিপিইউতে একাধিক কোর থাকায় আপনি কেবল আপনার প্রক্রিয়াটি চালাচ্ছেন সেই কোরটি সীমাবদ্ধ করে তুলবেন। আপনার সিওন চিপটি কীভাবে কনফিগার করা হয়েছে তার উপর নির্ভর করে এটি 12 টি কোরের (6 শারীরিক এবং 6 হাইপারথ্রেডিং সহ ভার্চুয়াল) চালিত হবে। এমনকি 64 বিট আর্কজিআইএস এটির সুবিধা নিতে সক্ষম হয় না - এবং এটির সিপিইউ সীমাবদ্ধতার ফলস্বরূপ যখন আপনার একক থ্রেডেড প্রক্রিয়াটি কোরটি চলমান থেকে সীমা ছাড়িয়ে যায়। আপনার কোর বা আরও লোড ছড়িয়ে দেওয়ার জন্য আপনার একাধিক-থ্রেডযুক্ত অ্যাপ্লিকেশন দরকার (আরও সহজভাবে) আপনি সিপিইউ যে পরিমাণ कोरটি চালাচ্ছেন তা হ্রাস করতে পারবেন থ্রুপুট বাড়ানোর জন্য।

সিপিইউ সীমাবদ্ধতা বন্ধ করার সহজ উপায় (এবং এটি সত্যই সিপিইউ সীমাবদ্ধতা ডিস্ক নয় I / o বিধিনিষেধের বিষয়টি নিশ্চিত করুন) আপনার জিওনের জন্য BIOS সেটিংস পরিবর্তন করা এবং এটি একটি বৃহত একক কোরে সেট করা। কর্মক্ষমতা বৃদ্ধি যথেষ্ট হবে। কেবল মনে রাখবেন এটি আপনার পিসিগুলি মাল্টি-টাস্কিংয়ের ক্ষমতাও যথেষ্ট পরিমাণে ব্যবসা করে so তাই আপনার যদি এটি প্রয়োগ করার জন্য ডেডিকেটেড প্রক্রিয়া মেশিন থাকে তবে সেরা। আপনার কোডটি মাল্টি-থ্রেড করার চেষ্টা করার চেয়ে অনেক সহজ - যা বেশিরভাগ আর্কজিআইএস ডেস্কটপ ফাংশন (10.3.1 হিসাবে) যাইহোক সমর্থন করে না।


আপনার সিপিইউকে "একটি বৃহত্তর একক কোর" রূপান্তর করতে আপনার কী সেটিংয়ের সন্ধান করা উচিত?
অ্যালেক্স ম্যাকভিটি 20

1
নির্ভুল মেনু আপনার BIOS এবং চিপ ফার্মওয়্যারের উপর নির্ভর করবে তবে এটি সাধারণত BIOS মেনু সেটআপ> অ্যাডভান্সড> সিপিইউ কনফিগারেশনে থাকবে। আপনি হাইপার-থ্রেডিং বন্ধ করতে চাইবেন এবং তারপরে সক্রিয় করার জন্য কোরের সংখ্যা সেট করুন। 0 সাধারণত সমস্ত হয় - আপনি যদি একটি বড় কোর চান তবে 1 তে সেট করুন। আপনি জিনিসগুলি পরিবর্তন করার আগে সেটিংসের একটি নোট নেওয়া ভাল ধারণা - যদি জিনিসগুলি কাজ না করে তবে অবশ্যই এটিকে উপেক্ষা করা সহজ।
কিংমি 6
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.