ในสคริปต์ python 2.7 หมายถึงโค้ดการประมวลผลหลายตัวตัวแรกที่ประมวลผลอาร์เรย์ numpy
อันใหญ่ โดยพื้นฐานแล้วนี่คือเฟรมบล็อกรังสีฉายระหว่างแผนภาพและระนาบคาร์ทีเซียน (โลก) ส่วนนั้นเรียกว่า poo1
ทำงานได้ดี
นอกจากนี้ในสคริปต์ ฉันพยายามที่จะสร้างโค้ดแบบมัลติโพรเซสเซอร์ขึ้นมาใหม่เพื่อฉายภาพจำนวนมากด้วยเฟรมบล็อกเรย์การฉายภาพนี้
ดูเหมือนว่าจะมีคนงานเพียง 4 ถึง 6 คนเท่านั้น แต่ทุกคนก็พร้อมที่จะกรอกข้อมูล pool2
สร้างผู้ปฏิบัติงาน โดยมีการใช้หน่วยความจำเพิ่มขึ้นช้า มีเพียง 6 คนเท่านั้นที่ใช้พลังงาน CPU
หมายเหตุ:
- ไม่มีการส่งออกกลับที่จะได้รับจากฟังก์ชั่นการประมวลผลหลายผลถ้าไฟล์เขียนในโฟลเดอร์;
- ไม่ต้องกังวลกับปัญหาขนาดหน่วยความจำ มีให้เลือกครึ่ง TB
- ไม่ต้องกังวลกับลำดับของกระบวนการ
- จำนวนคนทำงานคือคอร์ CPU จริง - 1 = 27;
- ความยาวของรายการงานที่จะแจกจ่าย (paramsGeoRef) สามารถมีได้ตั้งแต่ 1 ถึง 250 แถว
ข้อมูลข้อโต้แย้ง:
- Frameclock ndarray ขนาดใหญ่สามารถเป็น GB ได้
- A1 : ndarray สามารถมีได้หลายร้อย MB
- A2 : ndarray สามารถมีได้หลายร้อย MB
- B1 : ค่าจำนวนเต็ม
- B2 : ค่าจำนวนเต็ม
- fileName : สตริง, ชื่อ
- D1 : สตริง, เส้นทาง
- D2 : สตริง, เส้นทาง
- D3 : สตริง, เส้นทาง
- P1 : อาร์เรย์ขนาดเล็ก
- P2 : อาร์เรย์ขนาดเล็ก
การทำให้โค้ดง่ายขึ้นมีลักษณะดังนี้:
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()
ฉันลองใช้วิธีอื่น เช่น:
แยกข้อโต้แย้งก่อน:
def star_georef(Frameclock, A1,A2, B1, B2, fileName, D1, D2, D3, P1, P2):
return georef(*paramsGeoRef)
def georef(paramsGeoRef):
#Pseudo workflow...
return None
ใช้แผนที่ประเภทอื่น:
pool2.imap_unordered()
มีอะไรผิดพลาด? เหตุใดวิธีนี้จึงใช้งานได้สำหรับการกระทืบอาร์เรย์ numpy
แต่ไม่ใช่เพื่อจุดประสงค์นี้ ต้องการจัดการกับชิ้นใหญ่ๆ ใช่ไหม?
บางทีฉันอาจจะต้องให้อาหารคนงานทันทีที่มีเครื่องกำเนิดงาน?
Frameclock
GB ไปยังแต่ละกระบวนการ อาจดีกว่าถ้าทำให้เป็นmmap
และส่งต่อเพื่อหลีกเลี่ยงค่าใช้จ่ายที่เกี่ยวข้อง (ไม่ว่าคุณจะใช้ฮาร์ดแวร์จำนวนเท่าใดก็ตาม) - person martineau   schedule 04.10.2019