พูลการประมวลผลหลายตัว - ผู้ปฏิบัติงานส่วนใหญ่ถูกโหลดแต่ยังคงไม่ได้ใช้งาน

ในสคริปต์ 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 แต่ไม่ใช่เพื่อจุดประสงค์นี้ ต้องการจัดการกับชิ้นใหญ่ๆ ใช่ไหม?

บางทีฉันอาจจะต้องให้อาหารคนงานทันทีที่มีเครื่องกำเนิดงาน?


person Alex C.    schedule 04.10.2019    source แหล่งที่มา
comment
ฉันสงสัยว่าคอขวดเกี่ยวข้องกับการส่งอาร์กิวเมนต์ Frameclock GB ไปยังแต่ละกระบวนการ อาจดีกว่าถ้าทำให้เป็น mmap และส่งต่อเพื่อหลีกเลี่ยงค่าใช้จ่ายที่เกี่ยวข้อง (ไม่ว่าคุณจะใช้ฮาร์ดแวร์จำนวนเท่าใดก็ตาม)   -  person martineau    schedule 04.10.2019
comment
ฉันบันทึก Frameclock, A1 และ A2 ใน .npy ด้วย numpy ฉันโหลดมันใน georef แทน เพิ่มประสิทธิภาพมหาศาล!!! ขอบคุณ   -  person Alex C.    schedule 09.10.2019
comment
ดีใจที่ได้ยิน - ยินดีต้อนรับ   -  person martineau    schedule 09.10.2019
comment
คำถาม : การใช้ memmap (np.memmap) จะมีประสิทธิภาพมากกว่าผักดองเช่น as.npy หรือไม่ โดยเฉพาะอย่างยิ่งเมื่อคุณใช้ MB ndarray หลายร้อย MB   -  person Alex C.    schedule 10.10.2019
comment
ใช่ การใช้แผนผังหน่วยความจำจะช่วยให้สามารถแบ่งปันข้อมูลระหว่างกระบวนการต่างๆ ได้อย่างมีประสิทธิภาพ ซึ่งเป็นเหตุผลที่ฉันแนะนำให้ใช้ในตอนแรก   -  person martineau    schedule 10.10.2019


คำตอบ (1)


ตามคำแนะนำของ Martineau

ฉันบันทึกข้อโต้แย้งของ Frameclock, A1 และ A2 ด้วย numpy ในรูปแบบ .npy จากนั้นฉันก็โหลด .npy ภายในไฟล์.

เช่น :

def georef(paramsGeoRef):

    #Pseudo workflow
    """
    - unpack arguments, Frameblock, A1,A2, B1, B2, fileName, D1, D2, D3, P1, P2 <== paramsGeoRef
    - load Frameblock from his .npy
    - load A1 from his .npy
    - load A2 from his .npy
    - 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

แม้จะบันทึกและโหลด แต่ก็เป็นการเพิ่มประสิทธิภาพอย่างมาก! คนงานทุกคนทำงาน

person Alex C.    schedule 09.10.2019