簡體   English   中英

多處理池 - 大多數工作人員已加載但仍處於空閑狀態

[英]Multiprocessing Pool - most workers are loaded but still idle

在 python 2.7 腳本中,第一個用於處理numpy數組的大塊的多處理代碼。 這基本上是圖像平面和笛卡爾(世界)平面之間的投影光線幀塊。 那部分,稱為poo1 ,工作正常。

在腳本中,我嘗試重現多處理代碼以使用此投影光線幀塊投影大量圖像。

似乎只有 4 到 6 名工作人員在工作,但他們都准備好填寫數據了。 pool2創建工人,他們在 memory 使用率增長緩慢,其中只有多達 6 個正在使用 CPU 能力。

截圖 在多處理期間不工作的工人

備注

  • 沒有 output 返回從多處理 function 得到,output 如果一個文件寫入一個文件夾;
  • 不用擔心 memory 大小問題,半 TB 可用;
  • 不用擔心流程的順序;
  • 工人數是物理 CPU 核心 - 1 = 27;
  • 要分發的作業列表 (paramsGeoRef) 的長度可以是 1 到 250 行。

Arguments 信息

  • Frameclock,海量ndarray,可以是GB
  • A1:ndarray,可以是幾百MB
  • A2:ndarray,可以是幾百MB
  • B1:integer值
  • B2:integer 值
  • 文件名:字符串,名稱
  • 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

使用另一個 map 類型:

pool2.imap_unordered()

怎么了? 為什么此方法適用於處理numpy陣列,但不適用於此目的? 需要處理塊大小?

也許,我可能需要盡快為工人提供工作生成器?

聽從馬蒂諾的建議,

我使用 numpy in.npy 格式保存 Frameclock、A1 和 A2 參數。 然后我在並行化中加載.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

即使保存和加載這些也是極大的效率增益。 所有工人工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM