多处理池大多数工作线程已加载,但仍然是id

2024-06-06 20:25:23 发布

您现在位置:Python中文网/ 问答频道 /正文

在python2.7脚本中,第一个用numpy数组处理大数据块的多处理代码。这基本上是图像平面和笛卡尔(世界)平面之间的投影光线帧块。这部分叫做poo1,工作正常。你知道吗

在脚本的后面,我尝试重新生成多处理代码,用这个投影光线frameblock投影很多图像。你知道吗

似乎只有4到6个工人在工作,但他们都准备好了工作填充数据。pool2创建了worker,它们的内存使用率增长缓慢,其中只有6个在使用CPU。你知道吗

屏幕截图Workers that do not work during multiprocessing

注意事项:

  • 没有从多处理函数中得到输出返回,如果输出一个文件写入一个文件夹中
  • 无需担心内存大小问题,半TB可用
  • 不必担心过程的顺序
  • 工人数量是物理CPU核心-1=27
  • 要分发的作业列表(paramsGeoRef)的长度可以是1到250行。你知道吗

参数信息:

  • 帧钟,大数组,可以是GB
  • A1:ndarray,可以是数百MB
  • A2:ndarray,可以是数百MB
  • B1:整数值
  • B2:整数值
  • 文件名:string,name
  • 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数组,而不是用于此目的?需要处理块大小的文件吗?你知道吗

也许,我可能需要养活工人,只要他们有工作发电机?你知道吗


Tags: a2a1数组b2b1d2d1d3
1条回答
网友
1楼 · 发布于 2024-06-06 20:25:23

遵循马提诺的建议

我以.npy格式保存带有numpy的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

即使节省和加载这些是一个巨大的效率增益!所有工人都工作。你知道吗

相关问题 更多 >