Dalam skrip python 2.7, kode multiprosesor pertama yang memproses sebagian besar array numpy
. Ini pada dasarnya adalah blok bingkai sinar proyeksi antara bidang gambar dan bidang Cartesian (dunia). Bagian itu, yang disebut poo1
, berfungsi dengan baik.
Lebih lanjut dalam skrip, saya mencoba mereproduksi kode multiprosesor untuk memproyeksikan banyak gambar dengan frameblock sinar proyeksi ini.
Tampaknya hanya 4 hingga 6 pekerja yang bekerja tetapi semuanya siap bekerja mengisi data. pool2
menciptakan pekerja, penggunaan memori mereka lambat, hanya 6 di antaranya yang menggunakan daya CPU.
Catatan:
- Tidak ada output yang didapat dari fungsi multi-proses, output jika file ditulis dalam folder;
- Jangan khawatir tentang masalah ukuran memori, tersedia setengah TB;
- Jangan khawatir tentang urutan prosesnya;
- Jumlah pekerja inti CPU fisik - 1 = 27;
- Panjang daftar pekerjaan yang akan didistribusikan (paramsGeoRef) bisa dari 1 hingga 250 baris.
Info argumen:
- Frameclock, ndarray masif, bisa GB
- A1 : ndarray, bisa ratusan MB
- A2 : ndarray, bisa ratusan MB
- B1 : nilai bilangan bulat
- B2 : nilai bilangan bulat
- Nama file : string, nama
- D1 : string, jalur
- D2 : string, jalur
- D3 : string, jalur
- P1 : larik kecil
- P2 : susunan kecil
Penyederhanaan kode terlihat seperti ini:
def georef(paramsGeoRef):
#Pseudo workflow
"""
- unpack arguments, Frameclock, A1,A2, B1, B2, fileName, D1, D2, D3, P1, P2 <== paramsGeoRef
- Loading tif image
- Evergy convertion
with function and P1, P2
- Proportional projection of the image
- Frameclock, A1, A2
- Evergy convertion
with function and P1, P2
- Figure creation
- Geotiff creation
- export into file figure, geotiff and numpy file
"""
return None
if __name__ == '__main__':
paramsGeoRef = []
for im in imgfiles:
paramsGeoRef.append([Frameclock, A1, A2, B1, B2, fileName, D1 , D2 , D3 , P1 , P2])
if flag_parallel:
cpus = multiprocessing.cpu_count()
cpus = cpus - 1
pool2 = multiprocessing.Pool(processes=cpus)
pool2.map(georef, paramsGeoRef)
pool2.close()
pool2.join()
Saya mencoba pendekatan yang berbeda, seperti:
Bongkar argumen sebelumnya:
def star_georef(Frameclock, A1,A2, B1, B2, fileName, D1, D2, D3, P1, P2):
return georef(*paramsGeoRef)
def georef(paramsGeoRef):
#Pseudo workflow...
return None
Menggunakan jenis peta lain:
pool2.imap_unordered()
Apa yang salah? Mengapa metode ini berfungsi untuk mengolah array numpy
, tetapi tidak untuk tujuan ini? Perlu menangani ukuran besar?
Mungkin, saya perlu memberi makan pekerja segera setelah mereka tersedia dengan generator pekerjaan?
Frameclock
GB ke setiap proses. Mungkin lebih baik menjadikannyammap
dan meneruskannya untuk menghindari overhead yang terlibat (terlepas dari berapa banyak perangkat keras yang Anda gunakan). - person martineau   schedule 04.10.2019