Lebih

Memaksimalkan penggunaan CPU

Memaksimalkan penggunaan CPU


Skrip saya memotong garis dengan poligon. Ini adalah proses yang panjang karena ada lebih dari 3000 garis dan lebih dari 500.000 poligon. Saya mengeksekusi dari PyScripter:

# Impor waktu impor arcpy impor # Setel envvironment arcpy.env.workspace = r"E:DensityMapsDensityMapsTest1.gdb" arcpy.env.overwriteOutput = True # Setel timer dari datetime import datetime startTime = datetime.now() # Setel lokal variabel inFeatures = [r"E:DensityMapsDensityMapsTest.gdbGrid1km_Clip", "JanuaryLines2"] outFeatures = "JanuaryLinesIntersect" outType = "LINE" # Buat garis arcpy.Intersect_analysis(inFeatures, outFeatures, "", "", outType ) #Cetak akhir waktu cetak "Selesai"+str(datetime.now() - startTime)


Pertanyaan saya adalah: apakah ada cara untuk membuat CPU bekerja 100%? Ini berjalan pada 25% sepanjang waktu. Saya kira skrip akan berjalan lebih cepat jika prosesornya 100%. Salah menebak?
Mesin saya adalah:

  • Windows Server 2012 R2 Standar
  • Prosesor: Intel Xeon CPU E5-2630 0 @2,30 GHz 2,29 GHz
  • Memori terpasang: 31,6 GB
  • Jenis sistem: Sistem Operasi 64-bit, prosesor berbasis x64


Biar saya tebak: CPU Anda memiliki 4 core, jadi 25% penggunaan cpu, adalah 100% penggunaan satu core, dan 3 core idle.

Jadi satu-satunya solusi adalah membuat kode multi-utas, tetapi itu bukan tugas yang mudah.


Saya tidak begitu yakin bahwa ini adalah tugas yang terikat CPU. Saya pikir ini akan menjadi operasi yang terikat I/O, jadi saya akan mencari untuk menggunakan disk tercepat yang dapat saya akses.

Jika E: adalah drive jaringan, maka menghilangkannya akan menjadi langkah pertama. Jika itu bukan disk berkinerja tinggi (<7ms seek), maka itu akan menjadi yang kedua. Anda dapat memperoleh beberapa manfaat dari menyalin lapisan poligon kedalam kenanganruang kerja, tetapi manfaatnya mungkin bergantung pada ukuran kelas fitur poligon, dan apakah Anda menggunakan pemrosesan latar belakang 64-bit.

Mengoptimalkan throughput I/O sering kali merupakan kunci kinerja GIS, jadi saya sarankan Anda kurang memperhatikan CPU meter dan lebih memperhatikan jaringan dan disk meter.


Saya memiliki masalah kinerja yang serupa mengenai skrip arcpy, hambatan utama bukanlah CPU melainkan hard drive, jika Anda menggunakan data dari jaringan itu skenario terburuk, coba pindahkan data Anda ke drive SSD, lalu luncurkan skrip Anda dari baris perintah bukan dari pyscripter , pyscripter sedikit lebih lambat mungkin karena berisi beberapa hal debug, jika Anda tidak puas lagi, pikirkan tentang memparalelkan skrip Anda, karena setiap utas python membutuhkan satu inti CPU, CPU Anda memiliki 6 inti, sehingga Anda dapat meluncurkan 6 skrip secara bersamaan.


Saat Anda menggunakan python dan seperti yang disarankan di atas, pertimbangkan untuk menggunakan multiprocessing jika masalah Anda dapat dijalankan secara paralel.

Saya menulis artikel kecil di situs web geonet tentang mengubah skrip python menjadi alat skrip python yang dapat digunakan dalam pembuat model. Dokumen tersebut mencantumkan kode dan menjelaskan beberapa jebakan untuk menjalankannya sebagai alat skrip. Ini hanyalah satu tempat untuk mulai mencari:

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


Seperti yang dikatakan sebelumnya, Anda harus menggunakan multiprocessing atau threading. Tapi inilah peringatannya: Masalahnya harus dapat dibagi! Jadi, lihat https://en.wikipedia.org/wiki/Divide_and_conquer_algorithms.

Jika masalah Anda dapat dibagi, Anda akan melanjutkan seperti:

  • Buat antrian tempat Anda menyimpan data input untuk proses/utas
  • Buat antrian di mana hasilnya disimpan results
  • Buat fungsi atau kelas yang dapat digunakan sebagai proses/utas yang menyelesaikan masalah kita

Tetapi seperti yang dikatakan geogeek, ini mungkin bukan masalah pembatasan CPU, tetapi masalah IO. Jika Anda memiliki cukup RAM, Anda dapat melakukan pra-muat semua data dan kemudian memprosesnya, yang memiliki keuntungan bahwa data dapat dibaca sekaligus sehingga tidak selalu mengganggu proses perhitungan.


Saya memutuskan untuk mengujinya menggunakan 21513 garis dan 498596 poligon. Saya menguji pendekatan multiprosesor (12 prosesor di mesin saya) menggunakan skrip ini:

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"%nGroupFID" di %s" %str(fids) arcpy.MakeFeatureLayer_management(pGons,lyr,query) arcpy.Intersect_analysis([lines,lyr], outFeatures) mengembalikan fitur 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 detik' %(time.time()-t0))

Hasil, detik:

  • hard drive lokal normal - 191
  • drive lokal supercepat - 220
  • drive jaringan - 252

Lucunya hanya butuh 87 detik menggunakan alat geoprocessing dari mxd. Mungkin ada yang salah dengan pendekatan saya ke pool…

Seperti yang bisa dilihat, saya telah menggunakan kueri FID yang agak jelek di (0, 4, 8,12… 500000) untuk membuat tugas dapat dibagi.

Ada kemungkinan bahwa kueri berdasarkan bidang yang telah dihitung sebelumnya, mis. CFIELD=0 akan sangat mengurangi waktu.

Saya juga menemukan bahwa waktu yang dilaporkan oleh alat multiprosesor dapat sangat bervariasi.


Saya tidak terbiasa dengan PyScripter, tetapi jika itu didukung oleh CPython, maka Anda harus menggunakan multiprocessing dan bukan multi-threading selama masalahnya sendiri dapat dibagi (seperti yang telah disebutkan orang lain).

CPython memiliki Kunci Penerjemah Global, yang membatalkan manfaat apa pun yang dapat dihasilkan oleh banyak utas kasusmu.

Yang pasti dalam konteks lain, utas python berguna, tetapi tidak dalam kasus di mana Anda terikat dengan CPU.


Pertanyaan saya adalah: apakah ada cara untuk membuat CPU bekerja 100%

Karena CPU Anda memiliki banyak inti, Anda hanya akan memaksimalkan inti tempat proses Anda berjalan. Bergantung pada bagaimana Anda mengonfigurasi chip Xeon Anda, itu akan berjalan hingga 12 core (6 fisik dan 6 virtual dengan hyperthreading aktif). Bahkan ArcGIS 64bit tidak benar-benar dapat memanfaatkan ini - dan itu dapat mengakibatkan keterbatasan CPU ketika proses berulir tunggal Anda memaksimalkan inti yang dijalankannya. Anda memerlukan aplikasi multi-utas untuk menyebarkan beban di seluruh inti ATAU (lebih sederhana) Anda dapat mengurangi jumlah inti yang dijalankan CPU Anda untuk meningkatkan throughput.

Cara termudah untuk menghentikan pembatasan CPU (dan pastikan itu benar-benar pembatasan CPU bukan pembatasan disk i/o) adalah dengan mengubah pengaturan BIOS untuk Xeon Anda dan menyetelnya ke satu inti tunggal yang besar. Peningkatan kinerja akan sangat besar. Ingat saja ini juga menukar kemampuan multi-tasking PC Anda dengan cukup baik, jadi yang terbaik adalah jika Anda memiliki mesin proses khusus untuk mengimplementasikannya. Ini jauh lebih sederhana daripada mencoba multi-utas kode Anda - yang sebagian besar fungsi ArcGIS Desktop (seperti pada 10.3.1) tidak mendukung.


Tonton videonya: 30 memaksimalkan penggunaan fillet di Auto CAD