Saya mencoba untuk memproses beberapa data raster menggunakan ogr / gdal dan sepertinya saya tidak bisa mendapatkan pemanfaatan penuh dari semua core pada mesin saya. Ketika saya hanya menjalankan proses pada satu inti, saya mendapatkan utilisasi 100% dari inti itu. Ketika saya mencoba untuk memecah menjadi multicore (dalam contoh di bawah, dengan memotong x offset dan menempatkannya dalam antrian), saya mendapatkan pemanfaatan yang menyedihkan pada masing-masing 8 core saya. Sepertinya hanya menambah pemanfaatan hingga 100% di setiap inti (mis. 12,5% untuk masing-masing).
Saya khawatir bahwa menggunakan sumber data yang sama adalah hambatan, tapi kemudian saya menduplikasi file raster yang mendasari untuk setiap inti ... dan pemanfaatan inti masih omong kosong. Ini membuat saya percaya bahwa ogr atau gdal entah bagaimana berperilaku seperti sumber daya bersama bottleneck tapi saya tidak dapat menemukan apa pun online tentang itu. Bantuan apa pun akan sangat dihargai!
Ini adalah fungsi "pembantu" yang berjalan di dalam setiap utas Pekerja:
def find_pixels_intersect_helper(datasource, bounds_wkt, x_min, x_max):
bounds = ogr.CreateGeometryFromWkt(bounds_wkt)
rows_to_write = []
for x_offset in range(x_min, x_max):
for y_offset in range(datasource.RasterYSize):
pxl_bounds_wkt = pix_to_wkt(datasource, x_offset, y_offset)
pxl_bounds = ogr.CreateGeometryFromWkt(pxl_bounds_wkt)
if pxl_bounds.Intersect(bounds):
rows_to_write.append(['%s_%s' % (x_offset, y_offset), pxl_bounds.Centroid().ExportToWkt()])
Jawaban:
BAIK. Itu adalah hari dalam hidupku bahwa aku tidak akan pernah kembali lagi. Ternyata masalahnya bukan pada kode yang saya posting di atas. Tidak apa-apa. Ternyata ini adalah kasus threading.Proses vs multiproses. Proses.
Seperti yang ditunjukkan dalam dokumentasi python :
Dengan demikian, threading. Benang untuk operasi intensif-IO, multiprosesing. Proses untuk operasi intensif CPU. Saya beralih ke multiprocessing. Proses dan semuanya berfungsi dengan baik.
Lihatlah tutorial ini untuk mempelajari cara menggunakan multiprocessing.Process
sumber