Daha çox

CPU istifadəsini maksimum dərəcədə artırmaq


Ssenarim çoxbucaqlı xətləri kəsişir. Uzun bir müddətdir, çünki 3000-dən çox xətt və 500000-dən çox poliqon var. PyScripter-dən edam etdim:

# Import idxal arcpy idxal vaxtı # Set env Environment arcpy.env.workspace = r "E:  DensityMaps  DensityMapsTest1.gdb" arcpy.env.overwriteOutput = True # Datetime import from timetime set Date datetime startTime = datetime.now () # Set local dəyişənlər inFeatures = [r "E:  DensityMaps  DensityMapsTest.gdb  Grid1km_Clip", "JanuaryLines2"] outFeatures = "JanuaryLinesIntersect" outType = "LINE" # Arcpy.Intersect_analysis (inFeatures, outFeatures, ",", " ) #Print bitmə vaxtı çapı "Bitirdi" + str (datetime.now () - startTime)


Sualım budur: prosessorun 100% işləməsinin bir yolu varmı? Hər zaman 25% ilə işləyir. Hesab edirəm ki, prosessor 100% olsaydı, skript daha sürətli işləyəcəkdir. Yanlış təxmin?
Mənim maşınım:

  • Windows Server 2012 R2 Standard
  • İşlemci: Intel Xeon CPU E5-2630 0 @ 2.30 GHz 2.29 GHz
  • Qurulmuş yaddaş: 31,6 GB
  • Sistem növü: 64 bit Əməliyyat sistemi, x64 əsaslı prosessor


Tahmin edim: CPU'nuzun 4 nüvəsi var, bu səbəbdən% 25 cpu istifadəsi bir nüvənin% 100 və 3 boş nüvənin istifadəsidir.

Beləliklə, yalnız həll kodu çox yivli etməkdir, amma bu sadə bir iş deyil.


Bunun CPU ilə əlaqəli bir tapşırıq olduğuna o qədər də əmin deyiləm. Bunun I / O ilə əlaqəli bir əməliyyat olacağını düşünürdüm, ona görə daxil olduğum ən sürətli diskdən istifadə etmək istərdim.

E: bir şəbəkə sürücüsüdürsə, onu aradan qaldırmaq ilk addım olardı. Yüksək performanslı bir disk deyilsə (<7ms axtarmaq), o zaman ikinci olardı. Çoxbucaqlı təbəqəni an-a kopyalamaqdan müəyyən fayda əldə edə bilərsinizyaddaşdaiş sahəsi, lakin fayda çoxbucaqlı xüsusiyyət sinifinin ölçüsünə və 64 bitlik fon işləmə istifadə edib etməməyinizə bağlı ola bilər.

G / Ç məhsuldarlığını optimallaşdırmaq çox vaxt CİS-lərin işinin açarıdır, buna görə CPU sayğacına daha az diqqət ayırmağı və şəbəkə və disk sayğaclarına daha çox diqqət yetirməyinizi məsləhət görürəm.


Arcpy skriptləri ilə bağlı oxşar performans problemlərim var idi, əsas dar problem sabit disk deyil, əgər ən pis ssenari olan şəbəkədən məlumat istifadə edirsinizsə, məlumatlarınızı SSD sürücüsünə köçürməyə çalışın, sonra skriptinizi komanda xəttindən başladın pyscripterdən deyil, pyscripter biraz daha yavaş ola bilər, çünki bəzi düzəldici şeyləri ehtiva edir, əgər yenidən razı deyilsinizsə, skriptinizə paralellik etməyi düşünün, çünki hər python ipi bir CPU nüvəsi alır, CPU'nuz 6 nüvəyə sahibdir, buna görə başlaya bilərsiniz Eyni zamanda 6 skript.


Python istifadə etdiyiniz kimi və yuxarıda göstərildiyi kimi probleminiz paralel olaraq idarə oluna bilərsə, çox işləmə üsulundan istifadə edin.

Geonet veb saytında bir python skriptini model qurucuda istifadə edilə bilən bir python skript alətinə çevirmək barədə kiçik bir məqalə yazdım. Sənəddə kodu sadalayır və onu bir skript aləti kimi işə salmaq üçün bəzi çatışmazlıqlar təsvir olunur. Baxmağa başlamaq üçün yalnız bir yerdir:

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


Əvvəl də deyildiyi kimi çox işləmə və ya iplik istifadə etməlisiniz. Ancaq burada bir xəbərdarlıq var: Problem bölünən olmalıdır! Buna görə https://en.wikipedia.org/wiki/Divide_and_conquer_algorithms-ə baxın.

Əgər probleminiz bölünürsə, belə davam edəcəksiniz:

  • Proseslər / mövzu üçün giriş məlumatlarını saxladığınız bir növbə yaradın
  • Nəticələrin saxlandığı bir növbə yaradın
  • Problemimizi həll edən bir proses / mövzu kimi istifadə edilə bilən bir funksiya və ya sinif yaradın

Ancaq geogeek'in dediyi kimi, bu CPU məhdudlaşdıran problem deyil, IO problemi ola bilər. Kifayət qədər RAM-yə sahibsinizsə, bütün məlumatları əvvəlcədən yükləyə və sonra işləyə bilərsiniz, bu da üstünlüklərin bir anda oxunması sayəsində hesablama prosesini hər zaman dayandırmır.


21513 sətir və 498596 çoxbucaqlı istifadə edərək test etməyə qərar verdim. Bu skriptdən istifadə edərək çox prosessorlu yanaşmanı (maşınımdakı 12 prosessor) sınadım:

idxal arcpy, os idxal çox işləmə idxal vaxtı t0 = time.time () arcpy.env.overwriteOutput = True nProcessors = 4 qovluq = r'd:  scratch 'def funksiyası (girişlər): nGroup = girişlər [0] pGons = girişlər [ 1] satırlar = girişlər [2] outFeatures = '% s% s% s_% i.shp'% (qovluq, os.sep, 'inters', nGroup) fids = tople ([i aralığında i üçün (nGroup, 500000) , nProcessors-1)]) lyr = "% s layer"% nGroupFID "in% s"% str (fids) arcpy.MakeFeatureLayer_management (pGons, lyr, query) arcpy.Intersect_analysis ([lines, lyr], outFeatures) return outFeatures __name__ == "__main__": inPgons = "% s% s% s"% (qovluq, os.sep, 'parcels.shp') inLines = "% s% s% s"% (qovluq, os.sep, 'yollar.shp') m, bList = 0, [] mənzildə i üçün (nProcessors): bList.append ([i, inPgons, inLines]) pool = multiprocessing.Pool (nProcessors-1) listik = pool.map ( function, bList) ## tətbiq burada birləşmək listik çap ('% i saniyə'% (time.time () - t0))

Nəticələr, saniyə:

  • normal yerli sabit disk - 191
  • super sürətli yerli sürücü - 220
  • şəbəkə sürücüsü - 252

Mxd-dən jeoprosessinq alətindən istifadə etmək cəmi 87 saniyə çəkdi. Hovuza yanaşmağımda bəlkə də səhv bir şey var ...

Görüldüyü kimi (0, 4, 8,12 ... 500000) tapşırığı bölünə bilmək üçün olduqca çirkin sorğu FID istifadə etdim.

Əvvəlcədən hesablanmış sahəyə əsaslanan sorğunun, məsələn. CFIELD = 0 vaxtı xeyli azaldır.

Çox işləmə alətləri tərəfindən bildirilən vaxtın çox dəyişə biləcəyini də gördüm.


PyScripter ilə tanış deyiləm, amma CPython tərəfindən dəstəklənərsə, problemin özü bölünən olduğu müddətdə (başqalarının da qeyd etdiyi kimi) çox işləməli deyil, çox işləməli olmalıdır.

CPython, birdən çox mövzuya gətirə biləcək faydaları ləğv edən bir Qlobal Tərcüməçi Kilidinə malikdir sənin işin.

Əlbəttə ki, digər kontekstlərdə python mövzuları faydalıdır, ancaq CPU bağlı olduğunuz hallarda deyil.


Sualım budur: prosessorun 100% işləməsinin bir yolu varmı?

CPU'nuz birdən çox nüvəyə sahib olduğundan prosesinizin davam etdiyi nüvəni yalnız maksimum dərəcədə artıracaqsınız. Xeon çipinizi necə qurduğunuzdan asılı olaraq, 12 nüvəyə qədər işləyəcək (6 fiziki və 6 hiper işləmə ilə 6 virtual). 64bit ArcGIS belə, bundan həqiqətən faydalana bilmir və bu, tək yivli işləmə prosesinizin əsas hissəsini aşdıqda CPU məhdudiyyətləri ilə nəticələnə bilər. Yükü nüvələr arasında yaymaq üçün bir çox yivli bir tətbiqə ehtiyacınız var və ya (daha sadə), iş qabiliyyətini artırmaq üçün CPU'nuzun işlədiyi nüvələrin sayını azalda bilərsiniz.

CPU məhdudiyyətini dayandırmağın ən asan yolu (və bunun həqiqətən disk məhdudlaşdırması deyil, CPU məhdudluğu olduğuna əmin olmaq) Xeon üçün BIOS parametrlərini dəyişdirmək və böyük bir tək nüvəyə qoymaqdır. Performans artımı əhəmiyyətli olacaq. Bunu da unutma, həm də kompüterlərinizdə çox tapşırıq qabiliyyəti olduqca əhəmiyyətli dərəcədə yaxşıdır, əgər bunu həyata keçirmək üçün xüsusi texnoloji maşınınız varsa yaxşıdır. ArcGIS Desktop funksiyalarının əksəriyyətinin (10.3.1-də) onsuz da dəstəkləmədiyi kodunuzu çox mövzuya çevirməyə çalışmaqdan daha asandır.