[英]Multiprocessing Pool - most workers are loaded but still idle
在 python 2.7 脚本中,第一个用于处理numpy
数组的大块的多处理代码。 这基本上是图像平面和笛卡尔(世界)平面之间的投影光线帧块。 那部分,称为poo1
,工作正常。
在脚本中,我尝试重现多处理代码以使用此投影光线帧块投影大量图像。
似乎只有 4 到 6 名工作人员在工作,但他们都准备好填写数据了。 pool2
创建工人,他们在 memory 使用率增长缓慢,其中只有多达 6 个正在使用 CPU 能力。
备注:
Arguments 信息:
代码的简化如下所示:
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.