सीपीयू के उपयोग को अधिकतम करना


9

मेरी स्क्रिप्ट पॉलीगॉन के साथ लाइनों को काटना है। यह एक लंबी प्रक्रिया है क्योंकि 3000 से अधिक लाइनें और 500000 से अधिक बहुभुज हैं। मैं PyScripter से निष्पादित:

# 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 मानक
  • प्रोसेसर: Intel Xeon CPU E5-2630 0 @ 2.30 GHz 2.29 GHz
  • इंस्टॉल की गई मेमोरी: 31,6 जीबी
  • सिस्टम प्रकार: 64-बिट ऑपरेटिंग सिस्टम, x64- आधारित प्रोसेसर


यहां छवि विवरण दर्ज करें


मैं दृढ़ता से मल्टी-थ्रेडिंग के लिए जाने का सुझाव दूंगा। यह स्थापित करने के लिए गैर-तुच्छ है, लेकिन प्रयासों के लिए क्षतिपूर्ति से अधिक होगा।
अलोक झा

1
आपने अपने बहुविवाह पर किस तरह का स्थानिक सूचकांक लागू किया है?
कर्क कुक्केंडल

1
इसके अलावा, क्या आपने आर्कगिस प्रो के साथ एक ही ऑपरेशन की कोशिश की है? यह 64 बिट है और मल्टीथ्रेडेड का समर्थन करता है। मुझे आश्चर्य होगा अगर यह एक स्मार्ट को कई थ्रेड्स में तोड़ने के लिए पर्याप्त है, लेकिन एक कोशिश के लायक है।
कर्क कुक्केंडल

बहुभुज सुविधा वर्ग का एक स्थानिक सूचकांक है जिसका नाम FDO_Shape है। मैंने इस बारे में नहीं सोचा है। क्या मुझे दूसरा बनाना चाहिए? क्या यह पर्याप्त नहीं है?
मैनुअल फ्राइज़

1
जब से आपने बहुत सारी RAM प्राप्त की है ... क्या आपने बहुभुजों को एक इन-मेमोरी फीचरक्लास में कॉपी करने की कोशिश की और फिर उसके बाद की लाइनों को काट दिया? या अगर इसे डिस्क पर रखते हुए, क्या आपने इसे कॉम्पैक्ट करने की कोशिश की? माना जाता है कि कॉम्पैक्ट करने से i / o में सुधार होता है।
किर्क कुएकेन्डल

जवाबों:


13

मुझे लगता है: आपके सीपीयू में 4 कोर हैं, इसलिए 25% सीपीयू का उपयोग होता है, एक कोर का 100% उपयोग होता है, और 3 आईडीई कोर।

इसलिए कोड को बहु थ्रेडेड बनाने के लिए केवल समाधान है, लेकिन यह कोई सरल काम नहीं है।


4
सीपीयू वह उल्लेख है 6 कोर और 12 धागे का इस्तेमाल करता है।
केर्स्टन

5
नमस्ते वहाँ, मैं नीचे नहीं जा सकता, लेकिन मैं करना चाहता हूँ! अजगर के पास एक GIL दुर्भाग्य से है, इसलिए आप सामान को बिल्कुल भी नहीं बढ़ा सकते हैं (सबसे अच्छा आप जो कर सकते हैं वह GIL अनलॉक हो सकता है जब एक syscall पर थ्रेड ब्लॉक होता है)
Alec Teal

2
@AlecTeal आप निश्चित रूप से, उदाहरण के लिए Jython या multiprocessingमॉड्यूल के साथ कर सकते हैं ।
राइटफोल्ड

@ अच्छी तरह से जा रहा है "ओह, हाँ, आप पूरी तरह से पायथन में कर सकते हैं, अगर पायथन द्वारा आपका मतलब है कि ज्यथॉन की गिनती नहीं है। मुझे मल्टीप्रोसेसिंग में देखना होगा, क्या एक आयात में पायथन पायथन को फिर से लागू करने की शक्ति होगी?
एलेक टीले

@AlecTeal यह प्रक्रियाओं को जन्म देता है (जो कि समानता करने का एक तरीका है)। multiprocessingमॉड्यूल के प्रलेखन देखें ।
राइटफोल्ड

13

मुझे यकीन नहीं है कि यह एक सीपीयू-बाउंड कार्य है। मुझे लगता है कि यह एक आई / ओ-बाउंड ऑपरेशन होगा, इसलिए मैं सबसे तेज़ डिस्क का उपयोग करना चाहूंगा, जिसकी मुझे एक्सेस थी।

यदि E: एक नेटवर्क ड्राइव है, तो इसे समाप्त करना पहला कदम होगा। यदि यह एक उच्च प्रदर्शन डिस्क (<7ms की तलाश) नहीं है, तो वह दूसरा होगा। आप in_memoryकार्यक्षेत्र में बहुभुज परत को कॉपी करने से कुछ लाभ प्राप्त कर सकते हैं, लेकिन लाभ बहुभुज सुविधा वर्ग के आकार पर निर्भर हो सकता है, और चाहे आप 64-बिट पृष्ठभूमि प्रसंस्करण का उपयोग कर रहे हों।

I / O थ्रूपुट का अनुकूलन अक्सर जीआईएस प्रदर्शन के लिए महत्वपूर्ण होता है, इसलिए मैं आपको सीपीयू मीटर पर कम ध्यान देने और नेटवर्क और डिस्क मीटर पर अधिक ध्यान देने की सलाह दूंगा।


4

मुझे चापलूसी स्क्रिप्ट के बारे में प्रदर्शन की समान समस्याएं थीं, प्रमुख अड़चन यह हार्ड ड्राइव सीपीयू नहीं है, यदि आप नेटवर्क से डेटा का उपयोग कर रहे हैं जो सबसे खराब परिदृश्य है, तो अपने डेटा को एसएसडी ड्राइव पर ले जाने की कोशिश करें, फिर कमांड लाइन से अपनी स्क्रिप्ट लॉन्च करें। pyscripter से नहीं, pyscripter थोड़ा धीमा हो सकता है क्योंकि इसमें कुछ डीबगिंग सामग्री होती है, यदि आप फिर से संतुष्ट नहीं होते हैं, तो अपनी स्क्रिप्ट को समानांतर बनाने के बारे में सोचें, क्योंकि प्रत्येक अजगर धागा एक सीपीयू कोर लेता है, आपका सीपीयू 6 कोर है, इसलिए आप लॉन्च कर सकते हैं एक साथ 6 स्क्रिप्ट।


3

जैसा कि आप अजगर का उपयोग कर रहे हैं और जैसा कि ऊपर बताया गया है, यदि आपकी समस्या को समानांतर में चलाया जा सकता है, तो मल्टीप्रोसेसिंग का उपयोग करने पर विचार करें।

मैंने जियोनेट वेबसाइट पर एक छोटे से लेख को एक अजगर स्क्रिप्ट को एक अजगर स्क्रिप्ट टूल में परिवर्तित करने के बारे में लिखा था जिसे मॉडलबिल्डर के भीतर इस्तेमाल किया जा सकता था। दस्तावेज़ कोड को सूचीबद्ध करता है और इसे स्क्रिप्ट टूल के रूप में चलाने के लिए कुछ नुकसान का वर्णन करता है। यह केवल एक ही जगह है जिसे देखना शुरू करना है:

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


यह जाने का रास्ता लगता है! आपकी स्क्रिप्ट ठीक काम करती है लेकिन मुझे नहीं पता कि इसे कैसे संशोधित करके मेरी स्क्रिप्ट के साथ काम करना है। बेहतर है, मैं बहुभुज और लाइनों के साथ एक टैबुलेट इंटरसेक्शन करने के बारे में सोच रहा था। कोई उपाय?
मैनुअल फ्राइज़

3

जैसा कि पहले कहा गया है कि आपको मल्टीप्रोसेसिंग या थ्रेडिंग का उपयोग करना चाहिए । लेकिन यहाँ कैवियट आता है: समस्या को विभाज्य होना चाहिए! तो https://en.wikipedia.org/wiki/Divide_and_conquer_al एल्गोरिदम पर एक नज़र डालें ।

यदि आपकी समस्या विभाज्य है तो आप आगे बढ़ना चाहेंगे:

  • एक कतार बनाएँ जहाँ आप प्रक्रियाओं / थ्रेड के लिए इनपुट डेटा संग्रहीत करते हैं
  • जहाँ परिणाम संग्रहीत हैं, वहाँ एक कतार बनाएँ
  • एक फ़ंक्शन या वर्ग बनाएं जो एक प्रक्रिया / धागे के रूप में इस्तेमाल किया जा सकता है जो हमारी समस्या को हल करता है

लेकिन जैसा कि जियोगेक ने कहा है, यह एक सीपीयू समस्या को सीमित करने वाला नहीं हो सकता है, बल्कि एक आईओ एक है। यदि आपके पास पर्याप्त रैम है तो आप सभी डेटा को प्री-लोड कर सकते हैं और फिर उसे प्रोसेस कर सकते हैं, जिसका यह फायदा है कि डेटा को एक बार में पढ़ा जा सकता है और इस तरह हमेशा गणना प्रक्रिया को बाधित नहीं करता है।


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

मजेदार बात यह है कि यह केवल 87 सेकंड mxd से जियोप्रोसेसिंग उपकरण का उपयोग कर लिया। शायद पूल के लिए मेरे दृष्टिकोण के साथ कुछ गलत ...

जैसा कि कोई देख सकता है कि मैंने टास्क को विभाज्य बनाने के लिए इसमें (०, ४, …,१२ ... ५०००००) के बजाय बदसूरत क्वेरी FID का उपयोग किया है।

यह संभव है कि पूर्व-परिकलित फ़ील्ड के आधार पर क्वेरी, जैसे CFIELD = 0 में समय बहुत कम हो जाएगा।

मैंने यह भी पाया कि मल्टीप्रोसेसिंग टूल द्वारा रिपोर्ट किया गया समय बहुत भिन्न हो सकता है।


1
हाँ, आप एक सूची का उपयोग कर रहे हैं, जो लॉकिंग मुद्दों के साथ आती है। एक मल्टीप्रोसेसिंग की कोशिश करें। यह भी कोशिश करें कि कार्यकर्ता प्रक्रियाओं में सामान न लिखें, लेकिन जो डेटा आप लिखना चाहते हैं, उसके साथ एक ouput कतार बनाएं और इसे एक लेखक प्रक्रिया द्वारा पूरा करने दें।
बेंजामिन

3

मैं PyScripter से परिचित नहीं हूँ, लेकिन अगर यह CPython द्वारा समर्थित है, तो आपको मल्टीप्रोसेसिंग के लिए जाना चाहिए, न कि मल्टी-थ्रेडिंग के रूप में जब तक समस्या स्वयं विभाज्य नहीं होती है (जैसा कि दूसरों ने पहले ही उल्लेख किया है)।

CPython में एक ग्लोबल इंटरप्रेटर लॉक है , जो किसी भी लाभ को रद्द करता है जो आपके मामले में कई थ्रेड ला सकता है ।

अन्य संदर्भों में निश्चित रूप से अजगर धागे उपयोगी होते हैं, लेकिन उन मामलों में नहीं जब आप सीपीयू बाध्य होते हैं।


1

मेरा सवाल है: क्या सीपीयू को 100% बनाने का कोई तरीका है

जैसा कि आपके CPU में कई कोर हैं आप केवल उस कोर को अधिकतम करेंगे जो आपकी प्रक्रिया चल रही है। आपके पास अपने एक्सोन चिप को कॉन्फ़िगर करने के तरीके के आधार पर यह 12 कोर (6 भौतिक और 6 वर्चुअल हाइपरथ्रेडिंग के साथ) तक चल रहा होगा। यहां तक ​​कि 64 बिट आर्कजीआईएस वास्तव में इसका लाभ उठाने में सक्षम नहीं है - और यह सीपीयू सीमाओं के परिणामस्वरूप हो सकता है जब आपकी एकल थ्रेडेड प्रक्रिया कोर को चालू करती है। आपको कोर पर लोड को फैलाने के लिए एक बहु-थ्रेडेड एप्लिकेशन की आवश्यकता होती है या (और भी बहुत कुछ) आप कोर की संख्या को कम कर सकते हैं जिससे आपका सीपीयू थ्रूपुट बढ़ाने के लिए चल रहा है।

CPU सीमा को रोकने का सबसे आसान तरीका (और यह सुनिश्चित करें कि यह वास्तव में CPU सीमा है डिस्क i / o प्रतिबंध नहीं है) अपने Xeon के लिए BIOS सेटिंग्स को बदलना और इसे एक बड़े पैमाने पर सिंगल कोर में सेट करना है। प्रदर्शन में वृद्धि पर्याप्त होगी। बस यह याद रखें कि यह आपके पीसी की मल्टी-टास्किंग क्षमता को काफी कम कर देता है, इसलिए यदि आपके पास इसे लागू करने के लिए समर्पित मशीन है तो यह सबसे अच्छा है। यह आपके कोड को बहु-सूत्रित करने की कोशिश करने की तुलना में बहुत सरल है - जो अधिकांश आर्कगिस डेस्कटॉप फ़ंक्शन (10.3.1 पर) वैसे भी समर्थन नहीं करता है।


अपने सीपीयू को "एक बड़े पैमाने पर सिंगल कोर" में बदलने के लिए आपको क्या सेटिंग दिखानी चाहिए?
एलेक्स मैकविटी

1
सटीक मेनू आपके BIOS और चिप फर्मवेयर पर निर्भर करेगा लेकिन यह आमतौर पर BIOS मेनू सेटअप> उन्नत> सीपीयू कॉन्फ़िगरेशन में होगा। आप हाइपर-थ्रेडिंग को बंद करना चाहेंगे और फिर सक्रिय करने के लिए कोर की संख्या निर्धारित करेंगे। 0 आम तौर पर सभी है - यदि आप एक बड़ा कोर चाहते हैं तो 1 पर सेट करें। चीजों को बदलने से पहले सेटिंग्स पर ध्यान देने के लिए अच्छा विचार - स्पष्ट लगता है लेकिन अनदेखी करना आसान है चीजों को काम नहीं करना चाहिए।
राजमी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.