多处理池-大多数工作程序已加载,但仍处于空闲状态

时间:2019-10-04 18:29:33

标签: python python-2.7 image-processing multiprocessing threadpool

在python 2.7脚本中,第一个多处理代码用于处理大块numpy数组。这基本上是图像平面和笛卡尔(世界)平面之间的投影射线框架。称为poo1的那部分工作正常。

在脚本的进一步内容中,我尝试重现多处理代码以使用此投影射线帧块投影很多图像。

似乎只有4到6名工人在工作,但他们所有人都准备好工作以填充数据。 pool2创建了worker,它们的内存使用量增长缓慢,只有多达6个使用CPU能力。

屏幕截图Workers that do not work during multiprocessing

注释

  • 没有从多处理函数获得的输出返回,如果文件写在文件夹中则输出;
  • 不用担心内存大小问题,只有一半TB可用;
  • 不用担心流程的顺序;
  • 工人数是物理CPU核心-1 = 27;
  • 要分发的作业列表的长度(paramsGeoRef)可以为1至250行。

参数信息

  • 帧时钟,大型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数组,但不适用于此目的?需要处理一个块大小吗?

也许,我可能需要在工作生成器可用时尽快养活他们?

1 个答案:

答案 0 :(得分:0)

按照马蒂诺的建议,

我用numpy保存.npy格式的Frameclock,A1和A2争论。然后我将.npy加载到parallelized中。

例如:

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

即使保存和加载这些文件,也可以大大提高效率!所有工人都在工作。